`
haoningabc
  • 浏览: 1476945 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

经典2fork解决僵死进程

    博客分类:
  • c
阅读更多
目的是父进程异步等待,子进程不变僵尸进程,(让子进程属于init)

。如果一个进程要f o r k一个子进程,但不要求它等待
子进程终止,也不希望子进程处于僵死状态直到父进程终止,实现这一要求的诀窍是调用fork
两次。
在第二个子进程中调用s l e e p以保证在打印父进程I D时第一个子进程已终止。在f o r k之后,
父、子进程都可继续执行——我们无法预知哪一个会先执行。如果不使第二个子进程睡眠,则
在fork之后,它可能比其父进程先执行,于是它打印的父进程I D将是创建它的父进程,而不是init进程
#include <sys/wait.h>   
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    pid_t   pid;

    if ((pid = fork()) < 0) {
        printf("fork error");
    } else if (pid == 0) {      /* first child */
        if ((pid = fork()) < 0)
            printf("fork error");
        else if (pid > 0)
            exit(0);    /* parent from second fork == first child */

        /*
         * We're the second child; our parent becomes init as soon
         * as our real parent calls exit() in the statement above.
         * Here's where we'd continue executing, knowing that when
         * we're done, init will reap our status.
         */
        sleep(2);
        printf("second child, parent pid = %d\n", getppid());
        exit(0);
    }
    
    if (waitpid(pid, NULL, 0) != pid)   /* wait for first child */
        printf("waitpid error");
    
    /*
     * We're the parent (the original process); we continue executing,
     * knowing that we're not the parent of the second child.
     */
    exit(0);
}
分享到:
评论

相关推荐

    僵尸进程介绍以及防范

    僵尸进程是计算机操作系统中的一种特殊状态,当一个进程执行完毕并退出,但其父进程尚未读取其退出状态时,这个已结束的进程就会成为僵尸进程。它的主要特征是进程已不再执行任何代码,但其进程描述符仍然存在于内存...

    Linux僵死进程的产生与避免.pdf

    例如,在fork一个子进程之后,父进程需要通过wait或waitpid函数来回收子进程的状态信息,以免子进程变成僵死进程。 在实际应用中,僵死进程可能会导致系统资源的浪费,例如内存、CPU时间等。因此,我们需要注意避免...

    linux中的僵尸进程

    2. **重启系统**:重启系统可以清除所有僵尸进程。 3. **使用`kill`命令**:使用`kill -9`命令可以直接终止父进程,从而间接地清除僵尸进程。 #### 六、示例代码分析 下面是一个简单的示例代码,演示了如何创建...

    消除僵尸进程的两种方法

    本文将深入探讨消除僵尸进程的两种常用方法,并通过示例代码文件`no_zombie1.c`和`no_zombie2.c`进行解释。 ### 方法一:父进程主动回收 当子进程终止时,操作系统会向父进程发送一个`SIGCHLD`信号,提示子进程的...

    谈谈守护进程和僵尸进程

    ### 谈谈守护进程和僵尸进程 #### 守护进程与僵尸进程的概念及应用场景 在深入探讨守护进程和僵尸进程之前,我们先简要回顾一下这两种进程的基本概念及其应用场景。 - **守护进程**(Daemon Process):是在后台...

    fork1() 编程fork1() 编程fork1() 编程fork1() 编程

    5. **僵尸进程与孤儿进程**: 如果父进程不等待子进程结束,子进程成为僵尸进程。孤儿进程是指其父进程先于它结束,会被init进程收养并等待清理。 **使用`fork()` 的场景** 1. **并发处理**: 父进程可以创建多个子...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    进程池start()后,需要调用wait()进行僵尸进程回收,可以无阻塞调用 获取进程状态(调用isAlive()方法)前,最好调用一个无阻塞的wait(false)进行一次回收,由于进程运行状态的判断不是原子操作,所以...

    Linux安全攻略——僵尸进程.pdf

    "Linux安全攻略——僵尸进程" Linux安全攻略——僵尸进程.pdf中讨论了Linux操作系统中的进程管理机制,包括进程的概念、进程调度、进程树、进程标识符、进程生命周期等方面的知识点。 进程概念 在Linux操作系统中...

    详解linux下避免僵尸进程的几种方法

    我们可以使用如下几种方法避免僵尸进程的产生: 1.在fork后调用wait/waitpid函数取得子进程退出状态。 2.调用fork两次(第一次调用产生一个子进程,第二次调用fork是在第一个子进程中调用,同时将父进程退出(第一...

    php中pcntl_fork创建子进程的方法实例

    在编程实践中,应当注意当子进程完成后要进行适当的回收处理,避免产生僵尸进程。父进程可以通过wait()或者waitpid()系统调用来回收已经完成的子进程资源。总之,掌握pcntl_fork的使用能够帮助PHP开发者编写出更加...

    PHP多进程编程之僵尸进程问题的理解

    僵尸进程是子进程已经结束运行,但其父进程尚未对其进行回收的进程,其进程描述符仍然存在于系统中。这种状态下的进程虽不再占用实际的资源,但会消耗系统的进程表项资源,过多的僵尸进程将导致系统资源的浪费,甚至...

    什么是PHP7中的孤儿进程与僵尸进程

    基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。...僵尸进程 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程

    UNIX 进程揭秘(探索运行在 UNIX 操作系统下的进程的生命周期)

    清单2展示了`fork()`的简单使用示例,调用`fork()`后,父进程和子进程都会继续执行,但每个进程会得到不同的返回值,子进程得到0,而父进程得到子进程的PID。 创建新进程后,子进程可以进一步通过`execve(2)`系统调...

    linux的进程函数

    如果不等待子进程结束,子进程将成为僵尸进程,占用系统资源。 7. 实战示例:编写一个简单的`fork()`程序,展示父进程创建子进程的过程,可以使用`printf()`输出不同的消息,以便观察哪个是父进程,哪个是子进程。 ...

    php多进程并发编程防止出现僵尸进程的方法分析

    然而,多进程编程也带来了一个潜在问题,那就是“僵尸进程”。僵尸进程是指子进程在完成其工作并退出后,其父进程没有及时回收其资源,导致进程表项仍然占用,从而影响系统性能。本文将深入探讨如何在PHP中防止多...

    LINUX编程-实验七进程与进程管理.pdf

    在回收子进程之前,子进程会变成僵尸进程。为了避免资源泄露,父进程应该及时回收其所有子进程。 7. 全局变量和局部变量在fork之后的行为: 由于fork()创建的新进程是调用进程的副本,所以父进程中的全局变量和局部...

    php 的多进程操作实践案例分析

    - 使用`pcntl`扩展进行多进程编程时,需要注意进程的同步问题,确保父进程能正确回收子进程资源,避免产生僵尸进程。 - 对于多子进程的创建和管理,应合理安排父进程对子进程的等待时机,避免程序逻辑的错误。 - 在...

    Linux进程、线程和调度(1)

    僵尸进程是指子进程已经结束,但父进程尚未对其进行回收的状态,这种情况如果没有得到妥善处理,将导致系统资源的浪费。 在Linux中,内存泄漏是指程序在申请内存后未能释放或者未能正确释放,导致随着时间的推移,...

Global site tag (gtag.js) - Google Analytics