Домашнее задание на неделю 45

Вопросы и задачи по истории и организации GNU и Unix-подобных систем.

  1. Обратившись к документации (например, http://retro11.de/ouxr/29bsd/usr/man/cat1/, cat8/), несложно убедиться в том, что следующие команды присутствовали уже в 2.9BSD (; последняя редакция — 2.11 patch 451, .)

    Сравните документированное поведение версий команд из 2.9BSD со стандартом IEEE Std 1003.1-2017 (POSIX.1-2017) и документацией на фактически доступные вам версии этих команд (в частности, http://manpages.debian.org/, http://gnu.org/s/coreutils/manual/html_node/, bc, bash, binutils, cssc, diffutils, ed, findutils, gawk, grep, m4, make, time.) Укажите сходства и различия.

    • at
    • awk
    • basename
    • bc
    • cal
    • cat
    • cd
    • chmod
    • chown
    • cmp
    • comm
    • cp
    • date
    • dd
    • df
    • diff
    • du
    • echo
    • ed
    • expand
    • expr
    • file
    • find
    • fold
    • grep
    • head
    • join
    • kill
    • ln
    • ls
    • m4
    • make
    • man
    • mesg
    • mkdir
    • more
    • mv
    • newgrp
    • nice
    • nm
    • od
    • pr
    • ps
    • pwd
    • renice
    • rm
    • time
    • touch
    • tr
    • true
    • tsort
    • tty
    • uniq
    • wait
    • wc
    • what
    • who
    • write
  2. Проверьте следующие фрагменты shell-кода на совместимость с IEEE Std 1003.1-2017 (POSIX.1-2017.) Укажите использованные в коде нестандартные возможности (расширения, специфичные для системы); предложите изменения, делающие код совместимым с POSIX.

    • set -e
      set -o noclobber
      
    • diff -c -- old new \
          | ${PAGER:-less}
      
    • #!/bin/bash
      printf %s\\n "${x/text/replacement}"
      
    • #!/bin/bash
      diff -u -- example.c \
          <(sed -e 's/printf\( ("[^"]\+)\)/puts\1/g')
      
    • cat > usr/share/doc/testpackage/changelog <<EOF
      testpackage (0.1) testsuite; urgency=medium
      
       * Hello, world!
      
       -- J. Random Hacker <jrh@example.net>  $(date --rfc-822)
      EOF
      
  3. Как можно удалить файл с двусимвольным именем -r?

  4. Многие команды (как, например, more) понимают имя файла - как обозначение для стандартного ввода. Предложите команду для просмотра файла с именем - в текущей директории.

  5. Традиционно, первым процессом, запускаемым в Unix-подобной системе, является init. До выхода UNIX System III () и UNIX System V (), эта программа, в свою очередь, передавала управление /etc/rc, а равно запускала программы обслуживания терминалов — согласно содержанию файла /etc/ttys. Такое поведение сохраняется в системах семейства BSD (как, например, FreeBSDсм., например, init(8), rc(8), ttys(5).)

    В версиях System III, System V, init читает файл /etc/inittab и запускает указанные в нем процессы — сообразно текущему состоянию и запросам пользователя. (Так, например, команда halt запрашивает у init начать процесс останова системы, что приводит к выполнению соответствующих строк inittab.)

    Обратившись к документации (sysvinit/README, inittab(5), init(8), README.runlevels, etc.), опишите действие двух строк следующего фрагмента файла inittab.

    id:2:initdefault:
    si::sysinit:/etc/init.d/rcS
    ~~:S:wait:/sbin/sulogin
    l2:2:wait:/etc/init.d/rc 2
    z6:6:respawn:/sbin/sulogin
    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
    pf::powerwait:/etc/init.d/powerfail start
    con:2345:respawn:/sbin/sulogin
    2:23:respawn:/sbin/getty 38400 tty2
    m1:23:respawn:/sbin/mgetty -s 57600 ttyS1
    
  6. В качестве альтернативы полнофункциональному System V-подобному init-процессу, в некоторых случаях (как, например, для контейнеров Linux, http://linuxcontainers.org/) можно использовать упрощенную версию init из состава BusyBox, http://busybox.net/.

    Опишите действие следующего конфигурационного файла busybox init.

    ::sysinit:/etc/init.d/rc S
    ::sysinit:/etc/init.d/rc 2
    ::ctrlaltdel:/etc/init.d/rc 6
    ::shutdown:/etc/init.d/rc 0
    ::restart:/bin/busybox init
    
  7. Вместо реализации цикла приема соединений в каждой конкретной сетевой службе (прикладного уровня), код может положится на выполняющий эту функцию суперсервер inetd, для чего в управляющий файл последнего inetd.conf(5) может быть внесена запись, подобная:

    dict  stream  tcp6  nowait  dictd.dictd /usr/sbin/dictd --inetd
    

    Опишите преимущества и недостатки такого подхода.