Метод 1: системный вызов waitpid()
Системный вызов waitpid() — это универсальный метод управления дочерними процессами. Указав PID дочернего процесса и предоставив опцию WNOHANG, мы можем проверить, завершился ли процесс. Если да, то возвращается PID. Вот пример на C:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// Child process code here
// ...
} else if (pid > 0) {
// Parent process code here
int status;
pid_t terminated_pid = waitpid(pid, &status, WNOHANG);
if (terminated_pid > 0) {
printf("Child process with PID %d has terminated.\n", terminated_pid);
}
} else {
// Error handling for fork() failure
}
return 0;
}
Метод 2: системный вызов sigaction() с сигналом SIGCHLD
Другой способ обработки завершения дочернего процесса — использование системного вызова sigaction() для перехвата сигнала SIGCHLD. Когда дочерний процесс завершается, этот сигнал отправляется родительскому процессу. Мы можем определить функцию обработчика сигнала для получения PID. Вот пример на Python:
import os
import signal
def sigchld_handler(signum, frame):
pid, status = os.waitpid(-1, os.WNOHANG)
if pid > 0:
print(f"Child process with PID {pid} has terminated.")
def main():
pid = os.fork()
if pid == 0:
# Child process code here
# ...
elif pid > 0:
# Parent process code here
signal.signal(signal.SIGCHLD, sigchld_handler)
# ...
else:
# Error handling for fork() failure
while True:
# Parent process continues its execution
# ...
Метод 3: функция popen() из модуля подпроцесса.
Если вы работаете с абстракциями более высокого уровня и предпочитаете более Pythonic-способ, вы можете использовать функцию popen() из модуля подпроцесса. Этот подход позволяет выполнить команду как дочерний процесс и получить ее PID. Вот пример:
import subprocess
def main():
command = ["ls", "-l"]
process = subprocess.Popen(command)
pid = process.pid
# ...
В этой статье мы рассмотрели различные методы получения PID завершенного дочернего процесса в среде Linux. Используя системные вызовы, такие как waitpid(), sigaction(), или абстракции более высокого уровня, такие как popen(), у разработчиков есть несколько вариантов выбора в зависимости от их языка программирования и конкретных требований.
Помните: понимание того, как получить PID завершенного дочернего процесса, необходимо для эффективного управления процессами и использования ресурсов в ваших приложениях.