ОЖИДАНИЕ ЗАВЕРШЕНИЯ ВЫПОЛНЕНИЯ ПРОЦЕССА.




FORK

fork - порождает дочерний процесс

 

СИНТАКСИС

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void);

 

ОПИСАНИЕ

fork порождает дочерний процесс, который отличается от родительского процесса только значениями PID (идентификатора процесса) и PPID (идентификатора родительского процесса), и значение счетчиков использования ресурсов равно 0. Блокировки файлов и сигналы, ожидающие обработки, не наследуются.

В Linux fork реализован с помощью метода "копирование страниц при записи" (copy-on-write), поэтому расходы на fork сводятся к копированию таблицы страниц родителя и созданию уникальной структуры, описывающей задачу порожденного процесса.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном завершении родительскому процессу возвращается PID дочернего, а дочернему процессу возвращается 0. При неудачном завершении родительскому процессу возвращается -1, дочерний процесс не создается, а в переменную errno записывается код ошибки.

 

WAIT

wait, waitpid - ожидает завершения процесса

 

СИНТАКСИС

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

 

ОПИСАНИЕ

Функция wait приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс не завершится, или до появления сигнала, который либо завершает текущий процесс, либо требует вызвать функцию-обработчик. Если дочерний процесс к моменту вызова функции уже завершился (так называемый "зомби" ("zombie")), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются. Функция waitpid приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс, указанный в параметре pid, не завершит выполнение, или пока не появится сигнал, который либо завершает текущий процесс либо требует вызвать функцию-обработчик. Если указанный дочерний процесс к моменту вызова функции уже завершился (так называемый "зомби"), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются. Параметр pid может принимать несколько значений:

 

1. < -1 - означает, что нужно ждать любого дочернего процесса, идентификатор группы процессов которого равен абсолютному значению pid.

2. -1 - означает ожидание любого дочернего процесса; функция wait ведет себя точно так же.

3. 0 - означает ожидание любого дочернего процесса, идентификатор группы процессов которого равен идентификатору текущего процесса.

4. >0 - означает ожидание дочернего процесса, чей идентификатор равен pid.

Значение options создается путем логического сложения нескольких следующих констант:

WNOHANG - означает немедленное возвращение управления, если ни один дочерний процесс не завершил выполнение.

WUNTRACED - означает возврат управления и для остановленных дочерних процессов, о статусе которых еще не было сообщено.

Если status не равен NULL, то функции wait и waitpid сохраняют информацию о статусе в переменной, на которую указывает status. Этот статус можно проверить с помощью нижеследующих макросов (они принимают в качестве аргумента буфер (типа int), - а не указатель на буфер!):

WIFEXITED(status) - не равно нулю, если дочерний процесс успешно завершился.

WEXITSTATUS(status) - возвращает восемь младших битов значения, которое вернул завершившийся дочерний процесс. Эти биты могли быть установлены в аргументе функции exit() или в аргументе оператора return функции main(). Этот макрос можно использовать, только если WIFEXITED вернул ненулевое значение.

WIFSIGNALED(status) - возвращает истинное значение, если дочерний процесс завершился из-за необработанного сигнала.

WTERMSIG(status) - возвращает номер сигнала, который привел к завершению дочернего процесса. Этот макрос можно использовать, только если WIFSIGNALED вернул ненулевое значение.

WIFSTOPPED(status) - возвращает истинное значение, если дочерний процесс, из-за которого функция вернула управление, в настоящий момент остановлен; это возможно, только если использовался флаг WUNTRACED.

WSTOPSIG(status) - возвращает номер сигнала, из-за которого дочерний процесс был остановлен. Этот макрос можно использовать, только если WIFSTOPPED вернул ненулевое значение.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Возвращает идентификатор дочернего процесса, который завершил выполнение, или ноль, если использовался WNOHANG и ни один дочерний процесс пока еще недоступен, или -1 в случае ошибки (в этом случае переменной errno присваивается соответствующее значение).

 

КОДЫОШИБОК

ECHILD - процесс, указанный в pid, не существует или не является дочерним процессом текущего процесса.

EINVAL - Аргумент options неверен.

EINTR - Использовался флаг WNOHANG, и был получен необработанный сигнал или SIGCHLD.

 

EXEC

execl, execlp, execle, execv, execvp - выполняют файл

 

СИНТАКСИС

#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg,...);

int execlp(const char *file, const char *arg,...);

int execle(const char *path, const char *arg,..., char * const

envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

 

ОПИСАНИЕ

Семейство функций exec заменяет текущий образ процесса новым образом процесса.

Параметр const char *arg и аналогичные записи в функциях execl, execlp, и execle подразумевают параметры arg0, arg1,..., argn. Все вместе они описывают один или нескольких указателей на строки, заканчивающиеся NULL, которые представляют собой список параметров, доступных исполняемой программе. Первый параметр, по соглашению, должен указывать на имя, ассоциированное с файлом, который надо исполнить. Список параметров должен заканчиваться NULL.

Функции execv и execvp предоставляют процессу массив указателей на строки, заканчивающиеся null. Эти строки являются списком параметров, доступных новой программе. Первый аргумент, по соглашению, должен указать на имя, ассоциированное с файлом, который необходимо исполнить. Массив указателей должен заканчиваться NULL.

Функция execle также определяет окружение исполняемого процесса, помещая после указателя NULL, заканчивающего список параметров (или после указателя на массив), argv дополнительного параметра. Этот дополнительный параметр является массивом уазателей на строки, завершаемые null, и должен заканчиваться указателем NULL. Другие функции извлекают окружение нового образа процесса из внешней переменной environ текущего процесса.

Некоторые из этих функций имеют особую семантику.

Функции execlp и execvp дублируют действия оболочки, относящиеся к поиску исполняемого файла, если указанное имя файла не содержит символ черты (/). Путь поиска определяется в окружении переменной PATH. Если эта переменная не определена, то используется путь поиска ":/bin:/usr/bin" по умолчанию. Дополнительно обрабатываются некоторые ошибки.

Если запрещен доступ к файлу (при попытке исполнения execve была возвращена ошибка EACCES), то эти функции будут продолжать поиск вдоль оставшегося пути. Если не найдено больше никаких файлов, то по возвращении они установят значение глобальной переменной errno равным EACCES.

Если заголовок файла не распознается (при попытке выполнения функции execve была возвращена ошибка ENOEXEC), то эти функции запустят оболочку (shell) с полным именем файла в качестве первого параметра. (Если и эта попытка будет неудачна, то дальнейший поиск не производится.)

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

Возвращение значения какой-либо из функций exec приведет к ошибке. При этом возвращаемым значением будет -1 и глобальной переменной errno будет присвоен код соответствующей ошибки.

 

GETPID

getpid, getpgrp, getppid - получение идентификаторов процесса, группы процесса и родительского процесса

СИНТАКСИС

int getpid ()

int getpgrp ()

int getppid ()

 

ОПИСАНИЕ

Системный вызов getpid возвращает идентификатор обратившегося к нему процесса.

Системный вызов getpgrp возвращает идентификатор группы обратившегося к нему процесса.

Системный вызов getppid возвращает идентификатор процесса-предка обратившегося к нему процесса.

 

Игнорирование гибели потомка: Signal(SIGCLD,SIG_IGN)

 

 

Задание.

ОЖИДАНИЕ ЗАВЕРШЕНИЯ ВЫПОЛНЕНИЯ ПРОЦЕССА.

Процесс может синхронизировать продолжение своего выполнения с моментом завершения потомка, если воспользуется системной функцией wait. Синтаксис вызова функции:

pid = wait(stat_addr);

где pid - значение кода идентификации (PID) прекратившего свое существование потомка, stat_addr - адрес переменной целого типа, в которую будет помещено возвращаемое функцией exit значение, в пространстве задачи.

main() { int child; if ((child = fork()) == 0) { printf("PID потомка %d\n",getpid()); pause(); /* приостанов выполнения до получения сигнала */ } /* родитель */ printf("PID потомка %d\n",child); exit(child); }Написать программу, которая ожидает выполнение процесса (см.код) и проанализировать ход ее выполнения

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-10 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: