$ atomic_append f1 1000000 & atomic_append f1 1000000

Повторите те же действия, ведя запись в другой файл, но на этот раз с указанием аргумента x:

$ atomic_append f2 1000000 x & atomic_append f2 1000000 x

Выведите на экран размеры файлов f1 и f2, воспользовавшись командой ls — l, и объясните разницу между ними.

5.4. Реализуйте функции dup() и dup2(), используя функцию fcntl() и, там где это необходимо, функцию close(). (Тот факт, что dup2() и fcntl() в некоторых случаях возникновения ошибок возвращают различные значения errno, можно проигнорировать.) Для dup2() не забудьте учесть особый случай, когда oldfd равен newfd. В этом случае нужно проверить допустимость значения oldfd, что можно сделать, к примеру, проверкой успешности выполнения вызова fcntl(oldfd, F_GETFL). Если значение oldfd недопустимо, функция должна возвратить –1, а значение errno должно быть установлено в EBADF.

5.5. Напишите программу для проверки совместного использования файловыми дескрипторами значения файлового смещения и флагов состояния открытого файла.

5.6. Объясните, каким должно быть содержимое выходного файла после каждого вызова write() в следующем коде и почему:

fd1 = open(file, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);

fd2 = dup(fd1);

fd3 = open(file, O_RDWR);

write(fd1, "Hello,", 6);

write(fd2, " world", 6);

lseek(fd2, 0, SEEK_SET);

write(fd1, "HELLO,", 6);

write(fd3, "Gidday", 6);

5.7. Реализуйте функции readv() и writev(), используя системные вызовы read(), write() и подходящие функции из пакета malloc (см. подраздел 7.1.2).

<p>6. Процессы</p>

В этой главе будет рассмотрена структура процесса, при этом особое внимание мы уделим структуре и содержимому виртуальной памяти процесса. Будут также изучены некоторые атрибуты процесса. В следующих главах мы рассмотрим другие атрибуты процесса (например, идентификаторы процесса в главе 9 и приоритеты процесса и его диспетчеризацию в главе 35). В главах 24–27 описываются особенности создания процесса, методы прекращения его работы и методы создания процессов для выполнения новых программ.

6.1. Процессы и программы

Процесс является экземпляром выполняемой программы. В данном разделе мы подробно разберем это определение и вы узнаете разницу между программой и процессом.

Программа представляет собой файл, содержащий различную информацию о том, как сконструировать процесс в ходе выполнения. В эту информацию включается следующее.

• Идентификационный признак двоичного формата. Каждый программный файл включает в себя метаинформацию с описанием формата исполняемого файла. Это позволяет ядру интерпретировать всю остальную содержащуюся в файле информацию. Изначально для исполняемых файлов UNIX было предусмотрено два широко используемых формата: исходный формат a.out (assembler output — вывод на языеке ассемблера) и появившийся позже более сложный общий формат объектных файлов — COFF (Common Object File Format). В настоящее время в большинстве реализаций UNIX (включая Linux) применяется формат исполняемых и компонуемых файлов — Executable and Linking Format (ELF), предоставляющий множество преимуществ по сравнению со старыми форматами.

Машинный код. В нем закодирован алгоритм программы.

Адрес входа в программу. В нем указывается место той инструкции, с которой должно начаться выполнение программы.

Данные. В программном файле содержатся значения, используемые для инициализации переменных, а также применяемые программой символьные константы (например, строки).

Таблицы имен и переадресации. В них дается описание расположений и имен функций и переменных внутри программы. Эти таблицы предназначены для различных целей, включая отладку и разрешение имен в ходе выполнения программы (динамическое связывание).

Информация о совместно используемых библиотеках и динамической компоновке. В программный файл включаются поля, где перечисляются совместно используемые библиотеки, которые программе потребуются в ходе выполнения, а также путевое имя динамического компоновщика, который должен применяться для загрузки этих библиотек.

• Другая информация. В программном файле есть и другая информация, описывающая способ построения процесса.

Одна программа может использоваться для построения множества процессов, или же, если наоборот, во множестве процессов может быть запущена одна и та же программа.

Определение процесса, которое было дано в начале этого раздела, можно переформулировать следующим образом. Процесс является абстрактной сущностью, которая установлена ядром и которой для выполнения программы выделяются системные ресурсы.

Перейти на страницу:

Похожие книги