Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 4


до вызова fork();

таблица открытых файлов процесса 0 ## ---<--- клавиатура 1 ## --->--- дисплей 2 ## --->--- дисплей ... ## fd ## --->--- файл TEST

... ##

после fork();

ПРОЦЕСС-ПАПА ПРОЦЕСС-СЫН

0 ## ---<--- клавиатура --->--- ## 0 1 ## --->--- дисплей ---<--- ## 1 2 ## --->--- дисплей ---<--- ## 2 ... ## ## ... fd ## --->--- файл TEST ---<--- ## fd ... ## | ## ... *--RWptr-->ФАЙЛ

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

той же структуре и, следовательно, имеют общий указатель чтения/записи для этого файла. Поэтому, когда процессы "отец" и "сын" пишут по дескриптору fd, они пользуются одним и тем же указателем R/W, т.е. информация от обоих процессов записывается последовательно. На принципе наследования и совместного использования открытых файлов основан также системный вызов pipe.

Порожденный процесс наследует также: реакции на сигналы (!!!), текущий каталог, управляющий терминал, номер владельца процесса и группу владельца, и.т.п.

При системном вызове exec() (который заменяет программу, выполняемую процессом, на программу из указанного файла) все открытые каналы также достаются в наследство новой программе (а не закрываются).

6.5.3. Процесс-копия это хорошо, но не совсем то, что нам хотелось бы. Нам хочется запустить программу, содержащуюся в выполняемом файле (например a.out). Для этого существует системный вызов exec, который имеет несколько разновидностей. Рассмотрим только две:

char *path; char *argv[], *envp[], *arg0, ..., *argn; execle(path, arg0, arg1, ..., argn, NULL, envp); execve(path, argv, envp);

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

/usr/bin/vi a.out ../mybin/xkick




Содержание  Назад  Вперед