- •Лабораторная работа №2 “Создание процесса с использование вызова fork()”
- •Выполнение Команды
- •Понятие создания процесса
- •Идентификация Процесса
- •Создание Процесса
- •Выполнение Файла
- •Int execv (const char *filename, char *const argv[]) (функция)
- •Завершение Процесса
- •Состояние завершения процесса
- •Пример Создания Процесса
- •Соответствие стандартам
- •Задание
Идентификация Процесса
Pid_t – тип данных для ID процесса. Получить ID процесса можно, вызвав функцию getpid. Функция getppid возвращает ID родителя текущего процесса. Программа должна включить заглавные файлы "unistd.h" и "sys/types.h" чтобы использовать эти функции.
pid_t
Pid_t – это целое число со знаком. В библиотеке GNU этот тип идентичен типу int.
pid_t getpid (void)
Возвращает ID текущего процесса.
pid_t getppid (void)
Возвращает ID родителя текущего процесса.
Создание Процесса
Функция fork() - примитив для создания процесса. Она объявлена в заглавном файле "unistd.h ".
pid_t fork (void)
Функция fork создает новый процесс.
Если функция выполнилась успешно, то она возвращает значение 0 в дочернем процессе и ID дочернего процесса в родительском процессе.
Если создание процесса потерпело неудачу, fork возвращает значение -1 в родительском процессе. Следующие значения ошибок errno определены для fork:
EAGAIN
недостаточно ресурсов системы, чтобы создать процесс, или пользователь уже запустил слишком много процессов
ENOMEM
процесс требует большего количества ресурсов, чем система может обеспечить
Специфические атрибуты дочернего процесса, которые отличаются от родительского процесса:
дочерний процесс имеет собственный уникальный ID
ID родителя дочернего процесса - ID родительского процесса
дочерний процесс получает собственные копии описателей открытых файлов родительского процесса. Впоследствии изменение атрибутов описателей файла в родительском процессе не будет воздействовать на описатели файла в дочернем, и наоборот
прошедшее процессорное время для дочернего процесса установлено на нуль
дочерний не наследует набор блокировок файла родительского процесса
дочерний не наследует набор таймеров родительского процесса
набор отложенных сигналов для дочернего процесса, очищен. (Дочерний процесс наследует маску блокированных сигналов и действий сигналов из родительского процесса.)
pid_t vfork (void)
Vfork-функция подобна fork, но более эффективна; однако, имеются ограничения, которым нужно учитывать, чтобы использовать ее безопасно.
В то время как fork делает полную копию адресного пространства вызывающего процесса и позволяет, и родителю и дочернему выполняться независимо, vfork не делает эту копию.
Дочерний процесс, созданный vfork, использует адресное пространство родителя, пока не вызывает одну из функций exec. Тем временем, родительский процесс приостанавливает свое выполнение.
Дочерний процесс, созданный vfork, не должен изменять любые глобальные данные или даже локальные переменные, доступные родительскому процессу. Кроме того, дочерний процесс не может возвращаться из функции, которая вызвала vfork! Это спутало бы информацию управления родительского процесса. Если Вы сомневаетесь, используйте fork.
Некоторые операционные системы не выполняют vfork. Библиотека GNU C разрешает использовать vfork на всех системах, но фактически выполняет fork, если vfork не доступна.
Выполнение Файла
Этот раздел описывает совокупность функций exec, для выполнения файла как образа процесса. Эти функции можно использовать, чтобы заставить дочерний процесс выполнить новую программу после того, как он был создан.
Функции отличаются определением аргументов, но они выполняют одну и ту же операцию. Все функции объявлены в заглавном файле "unistd.h".
