Linux программирование в примерах | страница 17



. Это последовательности двух или четырех байтов, которые ядро распознает в качестве специальных. Для обратной совместимости современные Unix-системы распознают несколько форматов. Файлы ELF начинаются с четырех символов «>\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 является текущим управляющим терминалом процесса — тем, который он слушает, когда пользователь набирает символ прерывания (обычно CTRL-C) или выполняет управление заданием (CTRL-Z).

Системы GNU/Linux и многие современные системы Unix предоставляют устройства