$ 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).
6. Процессы
В этой главе будет рассмотрена структура процесса, при этом особое внимание мы уделим структуре и содержимому виртуальной памяти процесса. Будут также изучены некоторые атрибуты процесса. В следующих главах мы рассмотрим другие атрибуты процесса (например, идентификаторы процесса в главе 9 и приоритеты процесса и его диспетчеризацию в главе 35). В главах 24–27 описываются особенности создания процесса, методы прекращения его работы и методы создания процессов для выполнения новых программ.
•
•
Одна программа может использоваться для построения множества процессов, или же, если наоборот, во множестве процессов может быть запущена одна и та же программа.
Определение процесса, которое было дано в начале этого раздела, можно переформулировать следующим образом. Процесс является абстрактной сущностью, которая установлена ядром и которой для выполнения программы выделяются системные ресурсы.