Понимание завершения дочернего процесса в Linux: получение PID с помощью системных вызовов

Метод 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 завершенного дочернего процесса, необходимо для эффективного управления процессами и использования ресурсов в ваших приложениях.