`
haoningabc
  • 浏览: 1442597 次
  • 性别: 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);
}
分享到:
评论

相关推荐

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

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

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

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

    谈谈守护进程和僵尸进程

    04年时维护的第一个商业服务就用了两次fork产生守护进程的做法,前两天在网上看到许多帖子以及一些unix书籍,认为一次fork后产生守护进程足够了,各有道理吧,不过多了一次fork到底是出于什么目的呢?

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

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

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

    PHP多进程编程之僵尸进程问题的理解 使用pcntl_fork函数可以让PHP实现多进程并发或者异步处理的效果:https://www.jb51.net/article/125789.htm 那么问题是我们产生的进程需要去控制,而不能置之不理。最基本的方式...

    多进程服务器编程C语言.zip

    多进程服务器编程C语言 1、理解进程的基本概念和基本的进程函数。 2、掌握网络编程的基本操作和设计原则。 3、掌握客户/服务器协议的原理。 4、服务器设计:使用fork来接收多个请求。...5、如何解决僵尸(zombie)问题。

    PYTHON学习教程-08-多线程.zip

    前情回顾 1.epoll模型 : 效率高 , 触发方式更多 2.本地套接字 AF_UNIX 本地两个进程间的消息通信 3.多任务编程 * 并行 和 并发 * 进程 线程 4. 多进程编程 时间片 PCB PID 父子进程 ...8. 孤儿进程和僵尸进程

    python多线程DAY01.txt

    8. 孤儿进程和僵尸进程 **************************************************** 如何避免僵尸进程产生 * 处理子进程退出状态 pid,status = os.wait() 功能 :在父进程中阻塞等待处理子进程退出 返回值: pid ...

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

    分享给大家供大家参考,具体如下: php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理。 ... //等待子进程中断,防止子进程成为僵尸进程。 pcntl_wait($status); } else {

    打通Linux脉络系列:进程、线程和调度.pdf

    1.3 僵尸进程 1.4 停止状态与作业控制 1.5 内存泄漏的真实含义 1.6 cpulimit 原理 2. 第二部分大纲 2.1 fork 和 vfork 区别 2.2 写时拷贝技术 2.3 Linux线程的实现本质 2.4 孤儿进程的托孤,SUBREAPER 练习...

    php多进程中的阻塞与非阻塞操作实例分析

    子进程退出后,父进程没有及时回收,就会产生僵尸进程。 例1: &lt;?php define('FORK_NUMS', 5); $pids = array(); //我们创建5个子进程 for($i = 0; $i &lt; FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if...

    操作系统实验报告

    (2)分析进程竞争资源现象,学习解决进程互斥的方法。 (3了解Linux系统中进程通信的基本原理。 三、实验内容与要求 (1)任务一:编写一段程序,使其实现进程的软中断通信。 要求:使用系统调用fork()创建两个子...

    Linux内核中的进程(二)

    在Linux中,通过fork创建子进程,子进程通过exit()系统调用终结进程并将其占用的资源释放掉,此时子进程被设置为僵死状态,父进程可以通过wait()或waitpid()系统调用查询子进程是否终结。  内核把进程的列表存放...

    Unix编程常见问题解答 高清PDF含书签目录

    1.1 Creating new processes: fork() 创建新进程:fork函数 1.1.1 What does fork() do? fork函数干什么? 1.1.2 What's the difference between fork() and vfork()? fork函数 与 vfork函数的区别在哪里? 1.1.3 ...

    尚观史上Linux嵌入式开发系统课程

    ├day18-01 fork与sighal的组合(避免僵尸进程).mp4 ├day18-02 匿名管道之创建、缓冲区大小、阻塞模式.mp4 ├day18-03 知识点总结.mp4 ├day19_匿名管道子父进程通信、有名管道创建、删除.mp4 ├day20_有名管道的...

    linux系统编程之线程.zip

    僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。 也可使用 pthread_create函数参2(线程属性)来设置线程分离。 【练习】:使用pthread_detach函数实现...

    操作系统UNIX系统及答案.doc

    由父进程执行系统调用fork创建一个子进程,这个子进程的初始状态为( )。 A.创建状态 B.睡眠状态 c.就绪状态 D.僵死状态 5.UNIX System v系统中,存储管理主要采用( )。A.对换技术 B.页式虚拟存储 c段式存储...

    UNIX 高级教程系统技术内幕

    2.8.7 僵尸(Zombie)进程 2.9 小结 2.10 练习 2.11 参考文献 第3 章 线程和轻量级进程(41) 3.1 简介 3.1.1 动机 3.1.2 多线程和多处理器 3.1.3 并发和并行 3.2 基本抽象概念 3.2.1 内核线程 3.2.2 轻量级进程 3.2.3 ...

    Makehttpd:制作一个http服务器,仅供学习

    Makehttpd ...完成步骤: 1、socket demo 2、简易http server 3、添加响应报文 ...9、增加信号处理,防止僵尸进程产生 10、增加200 OK的响应头 11、使用多线程实现并发(server_10.c) 12、使用epoll处理IO(server11.c)

    Linux高性能服务器编程

    12.2.5 往事件多路分发器中注册事件 12.2.6 eventop结构体 12.2.7 event_base结构体 12.2.8 事件循环 第13章 多进程编程 13.1 fork系统调用 13.2 exec系列系统调用 13.3 处理僵尸进程 13.4 管道 13.5 信号...

Global site tag (gtag.js) - Google Analytics