• Вызовы getpid()
getppid()
возвращают ID текущего и родительского процессов соответственно. Родителем процесса, первоначальный родитель которого завершается, становится специальный процесс init
с PID 1. Таким образом, PPID может меняться, и приложения должны быть готовы к этому.• Системный вызов nice()
• Системный вызов exec()
• Значение argv[0]
fork()
, значительный, но не идентичный набор атрибутов наследуется через exec
. Другие атрибуты сбрасываются для использования подходящих значений по умолчанию.• Функция atexit()
exit()
, _exit()
и _Exit()
все завершают программу, передавая статус завершения обратно родителю, exit()
очищает открытые потоки FILE*
и запускает функции, зарегистрированные с помощью atexit()
. Две другие функции завершаются немедленно и должны использоваться, лишь когда exec
в порожденном процессе завершилась неудачей. Возвращение из main()
подобно вызову exit()
с данным возвращаемым значением. В C99 и C++ выпадение из main()
в конце функции дает тот же результат, что и 'exit(0)
', но является плохой практикой.• wait()
waitpid()
являются функциями POSIX для получения статуса завершения порожденного процесса. Различные макросы позволяют определить, завершился ли порожденный процесс нормально, и в таком случае определить статус его завершения, или же порожденный процесс претерпел сигнал завершения, и в этом случае определить совершивший этот проступок сигнал. Со специальными опциями waitpid()
предоставляет также сведения о потомках, которые не завершились, но изменили состояние.• Системы GNU/Linux и большинство Unix-систем поддерживают также функции BSD wait3()
wait4()
. GNU/Linux поддерживает также выходящий из употребления union wait
. Функции BSD предоставляют struct rusage
, давая доступ к сведениям об использовании времени процессора, что может быть удобным. Хотя если waitpid()
будет достаточной, то это наиболее переносимый способ выполнения.• Группы процессов являются частью более крупного механизма управления заданиями, который включает сигналы, сеансы и манипулирование состоянием терминала, getpgrp()
getpgid()
возвращает PGID определенного процесса. Сходным образом, setpgrp()
устанавливает PGID текущего процесса равным его PID, делая его лидером группы процессов; setpgid()
дает возможность родительскому процессу установить PGID порожденного, который еще не выполнил exec
.• Каналы и FIFO предоставляют односторонний коммуникационный канал между двумя процессами. Каналы должны быть установлены общим предком, тогда как FIFO могут использоваться любыми двумя процессами. Каналы создаются с помощью pipe()
mkfifo()
. Каналы и FIFO буферируют свои данные, останавливая производителя или потребителя, когда канал заполняется или пустеет.• dup()
dup2()
создают копии дескрипторов открытых файлов. В сочетании с close()
они дают возможность поместить дескрипторы файлов на место стандартного ввода и вывода для каналов. Чтобы каналы работали правильно, все копии неиспользуемых концов каналов до исполнения программой назначения exec должны быть закрыты. Для создания нелинейных каналов может быть использован /dev/fd
, что демонстрируется возможностью замещения процессов оболочками Bash и Korn.• fcntl()
fcntl()
используется для следующего: • Дублирования дескриптора файла, имитирования dup()
dup2()
.