sem11 - Работа с процессами. Перенаправление стандартных потоков. (1114924), страница 2
Текст из файла (страница 2)
Если вызовзакончится неудачей, дальнейший поиск в пути поиска не производится.Таблица свойств функций семейства exec приведена ниже.Имяexecveexecvpexecvexecleexeclpexeclпередача списка аргументов в параметрахнетнетнетдададапоиск в путинетданетнетданетзадание нового окруженияданетнетданетнетТаблица 2: Свойства функций семейства exec1.3 Завершение работы процесса#include <stdlib.h>void exit(int status);void _exit(int status);void abort(void);Процесс может завершить свою работу одним из следующих способов:• Вызовом библиотечной функции exit(status);, где n — код завершения процесса.• Возвратом из функции main.
Этот способ эквивалентен предыдущему. В качестве кодазавершения процесса используется значение, возвращаемое из main.• Вызовом системного вызова _exit(status);, где n — код завершения процесса.• Получением необрабатываемого, неигнорируемого и неблокируемого сигнала, которыйвызывает по умолчанию нормальное или аварийное завершение процесса.Код возврата процесса — это некоторое целое число, обычно в интервале от 0 до 255(один байт). Оно может использоваться родительским процессом, чтобы определить, завершился ли процесс успешно или нет. Соглашение о взаимодействии процессов предполагает, что код завершения 0 означает успешное завершение процесса, а все прочие коды —5АтрибутНаследованиепри forkда, разделяютсяда, копируютсяпри записидададададаСтраницы кода программыСтраницы данных программыПеременные окруженияАргументы программыИдентификатор пользователя (uid)Идентификатор группы (gid)Эффективный идентификатор пользователя(euid)Эффективный идентификатор группы (egid) даИдентификатор процесса (pid)Идентификатор группы процессов (pgid)Идентификатор родительского процесса(ppid)Приоритет процесса (nice)Маска прав при создании файлов (umask)Ограничения процессов (limits)Счётчики использования ресурсовСигналы, обрабатываемые по умолчаниюИгнорируемые сигналыПерехватываемые сигналыСигналы, ожидающие доставкиФайловые дескрипторынетданетдададанетдададанетдаБлокировки файловРабочий каталогКорневой каталогнетдадаНаследованиеexecнетнетпривозможновозможнодадада, если не установлен бит SUIDда, если не установлен бит SGIDдададададададададанетнетда, если для дескриптора не установленфлаг FD_CLOEXECдададаТаблица 3: Наследование атрибутов при вызовах fork, execнеуспешное завершение.
Процесс может выработать код неуспешного завершения, если, например, он не смог открыть файл, необходимый для работы, или произошла другая ошибка,из-за которой процесс не смог выполнить ожидаемые от него действия. В случае незначительных ошибок, не влияющих значительно на выполнение процессом ожидаемых действий,следует вырабатывать код завершения 0.Библиотечная функция exit отличается от системного вызова _exit тем, что функцияexit выполнит корректное закрытие всех открытых дескрипторов потока и вызовет обработчики завершения работы процесса, зарегистрированные с помощью функции atexit.Системный вызов _exit вызывает немедленное завершение процесса, при этом содержимое незаписанных буферов файловых дескрипторов теряется. Ни одна из этих функций никогда не возвращает управление в программу.Когда процесс завершается из-за получения сигнала, никакой код завершения не формируется, но процесс-родитель может узнать, что данный процесс завершился из-за сигнала, иузнать номер сигнала, вызвавшего завершение работы процесса.
Обработчики завершения6работы процесса и открытые дескрипторы потока не закрываются. Некоторые сигналы поумолчанию вызывают аварийное завершение процесса. Это — сигналы, генерируемые принекоторых фатальных ошибках работы процесса, например, при доступе к адресам, не отображённым в адресное пространство процесса. При аварийном завершении ядро записываетсодержимое адресного пространства процесса и содержимое регистров центрального процессора в файл (обычно называемый core) в текущем каталоге. Это файл может потом использоваться для «посмертной отладки».Функция abort вызывает фатальное завершение работы процесса (как будто бы он получил сигнал SIGABRT).
Эта функция может использоваться, когда сама программа диагностировала состояние, когда она не может продолжить выполнение из-за ошибки в самойпрограмме. abort не должна использоваться, когда процесс завершает работу из-за ошибки во входных данных или в параметрах командной строки.В любом случае все ресурсы, связанные с процессом освобождаются, но запись в таблице процессов не удаляется для того, чтобы процесс-родитель смог прочитать статус завершения процесса.
Процесс в таком состоянии, когда все ресурсы уже освобождены, и осталась только запись в таблице процессов, называется «зомби». Если процесс-родитель «неинтересуется» судьбой сыновних процессов, они останутся зомби до тех пор, пока процессродитель не завершится. Тогда их родителем станет процесс 1 (init).
Как только родительский процесс прочитает статус завершения сыновнего процесса-зомби, запись в таблицепроцессов уничтожается, и процесс окончательно прекращает своё существование.1.4 Ожидание завершения сыновнего процессаПростейшая функция, с помощью которой можно узнать состояние процесса, — функцияwait.#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *pstatus)Функция wait приостанавливает выполнение текущего процесса до тех пор, пока какойлибо сыновний процесс не завершит своё выполнение, либо пока в процесс не поступит сигнал, который вызовет обработчик сигнала или завершит выполнение процесса. Если какойлибо сыновний процесс уже завершил выполнение («зомби»), функция возвращается немедленно, и процесс окончательно уничтожается.Если указатель pstatus не равен NULL, функция wait записывает информацию о статусе завершения по адресу pstatus.
Для получения информации о статусе завершения процесса могут использоваться следующие макросы. Они принимают в качестве параметра самстатус завершения процесса (типа int), а не указатель на него.WIFEXITED(status) — принимает ненулевое значение, если процесс завершил своёвыполнение нормально.WEXITSTATUS(status) — этот макрос может быть использован, только если вызовмакроса WIFEXITED дал ненулевое значение. Макрос выдаёт код возврата процесса, который был задан как аргумент функции exit или в операторе return функции main.WIFSIGNALED(status) — принимает ненулевое значение, если процесс завершилсвоё выполнение в результате получения необрабатываемого сигнала, который по умолчанию вызывает завершение работы процесса.7WTERMSIG(status) — этот макрос может быть использован, только если вызов макроса WIFSIGNALED дал ненулевое значение.
Макрос выдаёт номер сигнала, который вызвал завершение работы процесса.Функция возвращает идентификатор завершившегося процесса, либо -1 в случае ошибки. В этом случае переменная errno устанавливается в код ошибки. Возможные кодыошибки приведены в таблице.Больше возможностей предоставляет функция wait4, определённая следующим образом:#include <sys/types.h>#include <sys/resource.h>#include <sys/wait.h>pid_t wait4(pid_t pid, int *pstatus, int options,struct rusage *prusage)Функция wait4 приостанавливает выполнение процесса до тех пор, пока сыновний процесс с заданным идентификатором pid не завершит выполнение, либо пока процесс не получит сигнал, который вызовет обработчик сигнала или завершение работы процесса. Еслипроцесс с заданным идентификатором pid уже завершил работу к моменту вызова функцииwait4 (процесс-зомби), функция завершает работу немедленно.Аргумент pid может принимать следующие значения:< -1 ожидать завершения любого сыновнего процесса, идентификатор группыпроцессов которого совпадает с абсолютным значением pid-1ждать любой сыновний процесс (как функция wait)0ждать любой сыновний процесс, идентификатор группы процессов которогосовпадает с идентификатором группы процессов текущего процесса> 0ждать сыновний процесс с заданным идентификатором процесса pidЗначение options образуется как побитовое «или» одной или нескольких следующихконстант, либо может быть равен 0.WNOHANG — завершить работу немедленно, если нет сыновних процессов, завершившихвыполнение.WUNTRACED — возвращать информацию и о процессах, которые были приостановлены,и статус которых ещё не был сообщён.Если pstatus не равен NULL, информация о статусе завершения процесса записывается в область памяти, на которую указывает pstatus.Помимо макросов, позволяющих получить статус завершения процесса, описанных выше, могут использоваться следующие макросы.WIFSTOPPED(status) — возвращает ненулевое значение, если процесс, который вызвал завершение работы функции wait4 приостановлен.