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

C避免僵死进程

阅读更多
今天尝试用C写了一个socket程序,将单位的IP地址发布到外网去,程序很简单。其中使用了fork处理请求,但发现子进程结束后都处于僵死状态。查找了一下资料,因为父进程没有对子进程进行处理。
引用

默认情况下,父进程必须给子进程收尸,否则父进程不死,则死了的子进程将长期为僵尸。
被收养的进程是孤儿进程,也就是原本那个父进程死掉了

只有父进程退出了init才会收养这个父进程的所有子进程。父进程不退出,init闲着没事干去为人家的子女收尸啊。

init只收养孤儿进程,并定期对孤儿收尸。


处理方法有两种:
引用

fork一个子进程出来,然后父进程就会waitpid,以便释放子进程的资源,防止产生僵尸进程造成资源没有释放。


也可以不用waitpid,只要父进程对子进程在结束的时候发给父进程的SIG_CHLD信号处理就可以了,用signal函数接收.


http://blog.csdn.net/wan706364166/archive/2010/04/16/5492794.aspx
分享到:
评论

相关推荐

    linux中的僵尸进程

    ### Linux中的僵尸进程详解 ...了解僵尸进程的产生机制及如何避免僵尸进程的发生对于开发高质量的系统软件非常重要。通过合理的信号处理和进程管理策略,可以有效地避免僵尸进程问题,提高系统的稳定性和性能。

    消除僵尸进程的两种方法

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

    在Linux系统中查看进程及杀死僵尸进程的方法.docx

    ### 在Linux系统中查看进程及杀死僵尸进程的方法 #### 一、引言 在Linux操作系统中,进程管理是一项重要的任务,它涉及到系统性能优化、故障排查等多个方面。本文将详细介绍如何使用`ps`命令来查看系统中的进程...

    c语言进程管理器源码

    如果父进程没有等待子进程结束,子进程将成为僵尸进程。为了避免这种情况,父进程通常会调用`wait()`或`waitpid()`函数来等待子进程的结束。 在C语言中,我们还可以使用`signal()`和`raise()`函数来处理进程间的...

    Linux中僵尸进程和孤儿进程详解

    假设有一个父进程`P`创建了一个子进程`C`,如果`C`结束执行后,`P`没有调用`wait()`或`waitpid()`来清理`C`的状态,那么`C`将成为僵尸进程。当`P`也退出时,`C`会被init进程接管,最终完成清理过程。 #### 三、孤儿...

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

    以下介绍如何避免Linux系统中出现僵尸进程的四种方法: 1. **调用wait/waitpid函数**: 在创建子进程后,父进程应立即调用`wait()`或`waitpid()`函数,以等待子进程的结束并获取其退出状态。这会将子进程从系统...

    C/C++ 进程间 心跳检测

    心跳检测是一种常见的IPC机制,用于确认进程是否正常运行,即判断进程是否"live"或者已经僵死(僵尸状态)。这种机制常用于分布式系统、服务监控以及高可用性解决方案中。 心跳检测的基本思想是定期发送一个信号或...

    python subprocess 杀掉全部派生的子进程方法

    僵尸进程是指已经结束但其父进程尚未对其进行清理的进程。为了避免这种情况,可以在父进程中等待子进程结束。 ```python def wait_for_subprocess(p): # 等待子进程结束,并处理僵尸进程 p.wait() if p.return...

    Linux进程编程技术.doc

    Linux 进程编程技术 Linux 进程编程技术是指在 ...这些技术包括进程的基本概念、相关函数的应用、守护进程的概念、进程控制程序的编写、进程创建和管理、僵尸进程的避免、守护进程的实现、进程间通信和进程同步等。

    C语言编写Linux守护进程实例

    7. **处理SIGCHLD信号**:处理子进程结束的信号,可以选择忽略、记录或等待子进程结束,以避免僵尸进程的出现。在Linux中,可以使用`signal(SIGCHLD, SIG_IGN)`来忽略该信号,或者注册一个处理函数。 编写守护进程...

    Linux守护进程的编程方法.pdf

    - 对于可能会创建子进程的守护进程来说,需要正确处理子进程结束后留下的僵尸进程问题。 - 示例代码: ```c signal(SIGCHLD, SIG_IGN); ``` 通过以上步骤,我们可以有效地编写出符合要求的Linux守护进程。这些...

    多进程服务器端1

    在C语言中,`fork()`函数定义在`unistd.h`头文件中,成功调用后,父进程和子进程都会继续执行`fork()`之后的代码,但`fork()`的返回值不同:父进程得到子进程的ID,而子进程得到0。 下面是一个简单的`fork()`使用...

    以实例全面讲解PHP中多进程编程的相关函数的使用

    设置`SIGCHLD`信号为`SIG_IGN`意味着父进程忽略子进程的结束,由内核自动回收,防止产生僵尸进程。如果不设置,父进程需要通过`pcntl_wait()`或`pcntl_waitpid()`来捕获子进程的退出状态,防止子进程变成僵尸状态。 ...

    Linux操作系统下守护进程的编程方法

    7. **处理SIGCHLD信号**:对于生成子进程的守护进程,需要妥善处理SIGCHLD信号,以避免子进程成为僵尸进程。在Linux中,可以简单地忽略SIGCHLD信号。 ```c signal(SIGCHLD, SIG_IGN); ``` 以上步骤提供了构建...

    Linux进程退出之方法论.docx

    在Linux操作系统中,进程的生命周期是系统管理的重要部分。当一个进程结束运行或者在执行过程中被强制终止,...在实际开发中,应根据需求选择合适的退出方式,并妥善处理进程间的通信和资源回收,避免产生僵死进程。

    linux-进程和线程

    - **僵尸进程和孤儿进程**:僵尸进程是已终止但其父进程未回收的进程,孤儿进程则是其父进程已经终止,被init进程收养。 2. **Linux下进程相关API** - **创建子进程函数(fork)**:`fork()`函数用于创建一个与调用...

    linux环境高级编程3-unix进程环境、进程控制和进程关系.ppt

    - **进程启动**:通常,C程序从`main()`函数开始执行。在`main()`被调用之前,系统会执行一个启动例程,将命令行参数和`main()`地址复制到进程控制块(PCB)的用户区域(u-area)。 - **进程终止**:进程可以通过...

    lovely_touching:一个简单的用于docker容器的初始化系统,可以避免未收割的僵尸并确保进程完全关闭。 写在Rust。 您可能应该改用嗅觉男爵,它是用C语言编写的,并且具有一些更有用的功能

    哦,不, -TLDR:您的进程可能会以不好的方式关闭,而僵尸进程将吞噬您的容器! 相反,只需使用lovely_touching : 下载它(此二进制文件可以在Centos / Redhat 5及更高版本的任何Linux版本上运行): wget ...

    多进程服务器端全部程序

    在`zombie.c`中,可能讲解了如何处理和避免僵尸进程。 6. **echo服务**:`echo_mpserv.c`可能实现了一个简单的回显服务器,它接收客户端发送的数据并原样返回。这是网络编程中常见的示例,用于测试网络连接和协议...

Global site tag (gtag.js) - Google Analytics