防止僵尸进程的fork编程

本文介绍了Linux中的孤儿进程和僵尸进程的基本概念,并提供了通过捕获SIGCHLD信号并使用waitpid函数来防止僵尸进程的编程示例。此外,提到了另一种避免僵尸进程的方法——双重fork技术,使得子进程退出后由init进程接管其孙子进程。
摘要由CSDN通过智能技术生成


基本概念:

孤儿进程与僵尸进程


原理就是捕获SIGCHLD信号,通过waitpid函数处理子进程退出,直接上代码:


----- gcc fork_one.c ----- 

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>

void sig_chld(int signo)
{
    pid_t pid;
    int stat;
    while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) //while循环是表示处理所有待处理的信号,-1表示任意子进程,WNOHANG表示非阻塞
        printf("child %d terminated\n", pid);
    return;
}

int main()
{
    signal(SIGCHLD, sig_chld);
    pid_t cli = fork();

    if (cli > 0) {
        printf("I am father\n");
    } else {
        printf("I am child\n");
        _exit(0);
    }
    while (1) {
        sleep(1);
    }
}


ps:还有一种办法就是双重fork,让子进程fork孙子进程,然后让子进程退出,孙子进程归init进程托管。

----- gcc fork_two.c ----- 

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

void Perror(const char *s)
{
    perror(s);
    exit(EXIT_FAILURE);
}

int main()
{
    pid_t pid;

    if ((pid = fork()) < 0) {
        Perror("fork error");
    } else if (pid == 0) { /* first child */
        if ((pid = fork()) < 0) {
            Perror("fork error");
        } else if (pid > 0) {
            exit(0); /* parent from second fork == first child */
        }
      sleep(2);
      printf("second child pid = %ld, parent pid = %ld\n",
              (long)getpid(), (long)getppid());
      exit(0);
    }

    if (waitpid(pid, NULL, 0) != pid) /* wait for first child */
        Perror("waitpid error");
    printf("parent for first child exit\n");
    exit(0);
}


参考:《unix网络编程》·卷1、《unix环境高级编程》·第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值