Ядро распознает, что исполняемый файл содержит двоичный объектный код, проверяя первые несколько байтов файла на предмет совпадения со специальными
\177ELF
».Помимо двоичных исполняемых файлов, ядро поддерживает также исполняемые
# !
. Сценарий является программой, исполняемой интерпретатором, таким, как командный процессор, awk, Perl, Python или Tcl. Строка, начинающаяся с #!
, предоставляет полный путь к интерпретатору и один необязательный аргумент:#! /bin/awk -f
BEGIN {print "hello, world"}
Предположим, указанное содержимое располагается в файле hello.awk
hello.awk
', ядро запускает программу, как если бы вы напечатали '/bin/awk -f hello.awk
'. Любые дополнительные аргументы командной строки также передаются программе. В этом случае, awk
запускает программу и отображает общеизвестное сообщение hello, world
.Механизм с использованием #!
hello.awk
переименовать просто в hello
, пользователь, набирающий 'hello
', не сможет сказать (и, конечно, не должен знать), что hello
не является двоичной исполняемой программой.1.1.4. Устройства
Одним из самых замечательных новшеств Unix было объединение файлового ввода- вывода и ввода-вывода от устройств.[14]
Устройства выглядят в файловой системе как файлы, для доступа к ним используются обычные права доступа, а для их открытия, чтения, записи и закрытия используются те же самые системные вызовы ввода-вывода. Вся «магия», заставляющая устройства выглядеть подобно файлам, скрыта в ядре. Это просто другой аспект движущего принципа простоты в действии, мы можем выразить это какВ повседневной практике, в частности, на уровне оболочки, часто появляются два устройства: /dev/null
/dev/tty
./dev/null
/dev/null
, уничтожаются операционной системой, а все попытки прочесть отсюда немедленно возвращают конец файла (EOF)./dev/tty
Системы GNU/Linux и многие современные системы Unix предоставляют устройства /dev/stdin
/dev/stdout
и /dev/stderr
, которые дают возможность указать открытые файлы, которые каждый процесс наследует при своем запуске.Другие устройства представляют реальное оборудование, такое, как ленточные и дисковые приводы, приводы CD-ROM и последовательные порты. Имеются также программные устройства, такие, как псевдотерминалы, которые используются для сетевых входов в систему и систем управления окнами, /dev/console
/dev/console
представлен экраном и клавиатурой, но это может быть также и последовательный портК сожалению, соглашения по именованию устройств не стандартизированы, и каждая операционная система использует для лент, дисков и т.п. собственные имена. (К счастью, это не представляет проблемы для того, что мы рассматриваем в данной книге.) Устройства имеют в выводе 'ls -l
b
или с
.$ ls -l /dev/tty /dev/hda
brw-rw-rw- 1 root disk 3, 0 Aug 31 02:31 /dev/hda
crw-rw-rw- 1 root root 5, 0 Feb 26 08:44 /dev/tty
Начальная 'b
c
' представляет символьные устройства. Файлы устройств обсуждаются далее в разделе 5.4, «Получение информации о файлах».1.2. Модель процессов Linux/Unix
Процесс является работающей программой.[15]
Процесс имеет следующие атрибуты:уникальный идентификатор процесса (PID);
• родительский процесс (с соответствующим идентификатором, PPID);
• идентификаторы прав доступа (UID, GID, набор групп и т.д.);
• отдельное от всех других процессов адресное пространство;
• программа, работающая в этом адресном пространстве;
• текущий рабочий каталог ('.
• текущий корневой каталог (/
• набор открытых файлов, каталогов, или и того, и другого;
• маска запретов доступа, использующаяся при создании новых файлов;
• набор строк, представляющих окружение[16]
;