Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
демон.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
333 Кб
Скачать
☆

23.3 Идентификация Процесса

Pid_t тип данных для ID процесса. Вы можете получить ID процесса, вызывая getpid. Функция getppid возвращает ID родителя текущего процесса (это также известно как ID родительского процесса). Ваша программа должна включить заглавные файлы " unistd.h " и " sys/types.h " чтобы использовать эти функции.

pid_t (тип данных)

Pid_t тип данных - целое число со знаком, который способен представить ID процесса. В библиотеке GNU, это - int.

pid_t getpid (void) (функция)

Getpid функция возвращает ID текущего процесса.

pid_t getppid (void) (функция)

Getppid функция возвращает ID родителя текущего процесса.

23.4 Создание Процесса

Функция fork - примитив для создания процесса. Она объявлена в заглавном файле " unistd.h ".

pid_t fork (void) (функция)

Функция fork создает новый процесс.

Если операция является успешной, то и родительский и дочерний процессы видят что fork возвращается, но с различными значениями: она возвращает значение 0 в дочернем процессе и ID порожденного процесса (ребенка) в родительском процессе.

Если создание процесса потерпело неудачу, fork возвращает значение -1 в родительском процессе. Следующие errno условия ошибки определены для fork:

EAGAIN

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

ENOMEM

процесс требует большего количества места чем система могла обеспечить.

Специфические атрибуты дочернего процесса, которые отличаются от родительского процесса:

  • Дочерний процесс имеет собственный уникальный ID.

  • ID родителя дочернего процесса - ID родительского процесса.

  • Дочерний процесс получает собственные копии описателей открытых файлов родительского процесса. Впоследствии изменение атрибутов описателей файла в родительском процессе не будет воздействовать на описатели файла в дочернем, и наоборот. См. Раздел 8.7 [Операции Управления].

  • Прошедшее процессорное время для дочернего процесса установлено на нуль; см. Раздел 17.1 [Процессорное время].

  • Дочерний не наследует набор блокировок файла родительского процессоа. См. Раздел 8.7 [Операции Управления].

  • Дочерний не наследует набор таймеров родительского процесса. См. Раздел 17.3 [Установка Сигнализации].

  • Набор отложенных сигналов (см. Раздел 21.1.3 [Получение Сигналов] ) для дочернего процесса, очищен. (Дочерний процесс наследует маску блокированных сигналов и действий сигналов из родительского процесса.)

pid_t vfork (void) (функция)

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

В то время как fork делает полную копию адресного пространства вызывающего процесса и позволяет, и родителю и дочернему выполняться независимо, vfork не делает эту копию.

Взамен, дочерний процесс, созданный с vfork совместно использует адресное пространство родителя, пока он не вызывает одну из функций exec. Тем временем, родительский процесс приостанавливает свое выполнение.

Вы должны быть очень осторожны, чтобы не позволить дочернему процессу, созданному с vfork изменять любые глобальные данные или даже локальные переменные, общедоступнные с родителем. Кроме того, дочерний процесс не может возвращаться из (или делать длинный переход) функции, которая вызвала vfork! Это спутало бы информацию управления родительского процесса. Если Вы сомневаетесь, используйте fork.

Некоторые операционные системы не выполняют vfork. Библиотека GNU C разрешает Вам использовать vfork на всех системах, но фактически выполняет fork, если vfork не доступна. Если Вы соблюдаете соответствующие предосторожности при использовании vfork, ваша программа будет работать, даже если система использует fork взамен.