`

python 信号处理僵尸进程

 
阅读更多

#! coding=utf-8

 

#使用信号解决zombie问题

 

import os, time, signal

 

 

 

def chldhandler(signum ,stackframe):

 

    while 1:

        try:

            result = os.waitpid(-1, os.WNOHANG)

 

        except:

            print '.............'

            break

    signal.signal(signal.SIGCHLD, chldhandler)

 

#每次收到SIGCHLD信号,就调用chldhandler这个处理函数

signal.signal(signal.SIGCHLD, chldhandler)

 

 

 

print "Before the fork ,my pid is ",os.getpid()

 

pid =os.fork()

 

if pid:

    print "hello from the parent ,the child will be pid %d" %pid

    print "in parent ,start time at %s"%(time.time())

    time.sleep(10)

    print "in parent ,end time at %s"%(time.time())

 

 

else:

    """

    5s 之后 子进程死掉,然后chldhandler处理僵尸进程

    """

    print "in child ,sart time at %s"%(time.time())

    time.sleep(5)

    print "in child ,end time at %s"%(time.time())

 

 

输出:

Before the fork ,my pid is  29566

in child ,sart time at 1375251988.9

hello from the parent ,the child will be pid 29567

in parent ,start time at 1375251988.9

in child ,end time at 1375251993.9

.............

in parent ,end time at 1375251993.9

 

五秒钟之后,子进程结束,父进程收到信号开始处理僵尸进程,发现其实父进程没有sleep 10秒,这是因为

sleep()有一个特殊的情况,如果任意一个信号处理程序被调用,睡眠会被立刻终止,而不是继续等待剩余的时间。

 

 

分享到:
评论

相关推荐

    python僵尸进程产生的原因

    在Python编程环境中,僵尸进程的产生是由于特定的进程生命周期管理机制导致的。在Unix或类Unix操作系统上,当一个子进程完成执行并...在Python中,合理地使用`wait`和处理`SIGCHLD`信号可以有效地防止僵尸进程的出现。

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

    # 等待子进程结束,并处理僵尸进程 p.wait() if p.returncode is None: os.waitpid(p.pid, 0) def main(): cmd = ['/bin/shtest.sh'] # 替换为你想要执行的命令 p = subprocess.Popen(cmd, preexec_fn=os....

    基于python的算法项目

    基于python的小算法,小项目 分为服务端和客户端 协议: Q(退出协议客户端发送Q协议) L(登录协议) R(注册协议) F(查找协议) H(查找历史记录协议) 当有一个客户端连接时候服务端会开一个进程进行与客户端交互 win用户:1...

    Python开发笔记.docx

    僵尸进程是指子进程已经结束,但其资源未被父进程回收,直到父进程执行wait()函数。孤儿进程是父进程先于子进程退出,子进程被init进程接管。避免僵尸进程的方法是在父进程中及时调用wait()或waitpid()来回收子进程...

    python实现多进程代码示例

    在提供的代码示例中,`p.daemon = True`就是用来设置子进程为守护进程,以避免僵尸进程的问题。 5. **Pool**: `multiprocessing.Pool`类提供了一种方便的方式来并行执行可迭代对象上的函数。通过创建一个进程池,...

    Python库 | deemon-2.0b5.tar.gz

    它可以确保进程在异常情况下优雅地退出,并且能控制子进程的行为,防止僵尸进程的产生。 3. **日志功能**:Deemon允许开发者指定日志输出的位置和格式,这在调试和监控后台服务时非常有用。它还支持标准输出和标准...

    python并发编程++++++

    - `terminate()`:强制结束进程,不执行任何清理操作,可能导致子进程变成僵尸进程。 - `is_alive()`:判断进程是否仍然存活。 - `join([timeout])`:等待进程结束,或在超时时间后返回,常用于确保主进程等待...

    进程线程作业

    8. **僵尸进程和孤儿进程**:当父进程退出而子进程还在运行时,子进程成为孤儿进程,通常会被init进程接管。而进程结束但其父进程没有等待(wait)它,该进程就成为僵尸进程,占用系统资源。 通过对以上知识点的...

    c99 学习笔记

    不过,从中可以辨识出诸如“位操作”、“scons”、“binutils”、“ELF文件格式”、“Linux进程模型”、“核心转储”、“线程”、“信号”、“僵尸进程”、“动态链接加载器”、“单元测试”、“内存池”、“垃圾...

    操作系统原理Linux篇

    Linux进程的状态主要包括:运行(Running)、可中断的睡眠状态(Sleeping Interruptible)、不可中断的睡眠状态(Sleeping Uninterruptible)、僵尸(Zombie)等。 **4.3 Linux的进程调度** Linux采用多级反馈队列调度算法...

    php pcntl_fork和pcntl_fork 的用法

    - 父进程通常会检查 `pcntl_fork()` 的返回值,并根据需要对子进程进行管理,比如通过 `pcntl_wait()` 或 `pcntl_waitpid()` 来等待子进程结束,防止僵尸进程的出现。 - 子进程在创建后,会从调用 `pcntl_fork()` ...

    C 学习笔记1

    6. **僵尸进程**:已结束但父进程未回收的进程。 7. **动态链接加载器**:加载和解析可执行文件的动态链接库。 8. **单元测试**:对代码模块进行独立测试的方法。 9. **内存池**:libmm库中的内存管理机制。 10....

Global site tag (gtag.js) - Google Analytics