linux

如何从脚本中避免僵尸进程

小樊
43
2025-08-09 03:38:28
栏目: 编程语言

在脚本中避免僵尸进程的方法如下:

  1. 使用wait()waitpid()函数:当子进程完成时,父进程应该调用wait()waitpid()函数来等待子进程结束。这样可以确保子进程的资源被正确回收,避免僵尸进程的产生。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        execlp("your_command", "your_command", NULL);
        exit(0);
    } else if (pid > 0) {
        // 父进程
        int status;
        waitpid(pid, &status, 0); // 等待子进程结束
    } else {
        // 错误处理
        perror("fork");
        return 1;
    }

    return 0;
}
  1. 使用信号处理器:为SIGCHLD信号设置一个信号处理器,当子进程结束时,信号处理器会被触发。在信号处理器中调用wait()waitpid()函数来回收子进程资源。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void sigchld_handler(int sig) {
    int status;
    pid_t pid;

    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        printf("Child process %d terminated.\n", pid);
    }
}

int main() {
    struct sigaction sa;

    sa.sa_handler = sigchld_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART;

    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        execlp("your_command", "your_command", NULL);
        exit(0);
    } else if (pid > 0) {
        // 父进程
        printf("Parent process continues.\n");
        sleep(10); // 等待子进程结束
    } else {
        // 错误处理
        perror("fork");
        return 1;
    }

    return 0;
}
  1. 使用nohup()函数:如果你希望子进程在父进程退出后继续运行,可以使用nohup()函数。这样,即使父进程退出,子进程也不会变成僵尸进程。
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        nohup(your_command, NULL);
        exit(0);
    } else if (pid > 0) {
        // 父进程
        printf("Parent process continues.\n");
        sleep(10); // 等待子进程结束
    } else {
        // 错误处理
        perror("fork");
        return 1;
    }

    return 0;
}

总之,为了避免僵尸进程,你需要确保父进程正确地回收子进程资源。这可以通过调用wait()waitpid()函数,设置信号处理器或者使用nohup()函数来实现。

0
看了该问题的人还看了