首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

os.waitpid上的"没有子进程"

在操作系统中,os.waitpid() 函数用于等待一个或多个子进程结束。当没有子进程可以等待时,会抛出 "没有子进程" 的错误。这是因为在调用 os.waitpid() 函数时,没有找到任何子进程的状态已经改变,这可能是因为子进程已经结束或者没有创建子进程。

为了解决这个问题,可以在调用 os.waitpid() 函数之前检查是否有子进程已经创建。可以使用 os.fork() 函数创建子进程,并使用 os.getpid()os.getppid() 函数获取进程ID和父进程ID。在调用 os.waitpid() 函数之前,可以使用 os.waitpid(-1, os.WNOHANG) 检查是否有子进程已经结束或者在等待状态。

以下是一个简单的示例代码:

代码语言:python
代码运行次数:0
复制
import os

pid = os.fork()

if pid == 0: # 子进程
    print("我是子进程,我的进程ID是:", os.getpid())
    os.execlp("ls", "ls")
else: # 父进程
    print("我是父进程,我的进程ID是:", os.getpid())
    try:
        while True:
            ret = os.waitpid(-1, os.WNOHANG)
            if ret == (0, 0):
                print("没有子进程")
                break
            else:
                print("子进程已经结束")
    except OSError as e:
        print("错误:", e)

在这个示例中,我们首先使用 os.fork() 函数创建一个子进程,然后在父进程中使用 os.waitpid(-1, os.WNOHANG) 检查是否有子进程已经结束或者在等待状态。如果没有子进程,则会抛出 "没有子进程" 的错误。如果有子进程,则会继续等待子进程结束。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

等待进程那些事儿

而对于 signal 而言,没有办法不接收进程非结束状态通知 (此时调用 wait 可能会卡死); 使用 sigaction 可以自动 wait 已结束进程,只要指定 SA_NOCLDWAIT...在上面的例子中,进程一启动就退出了,快到甚至父进程没有来得及执行 pid_add 就先执行了 pid_remove,这很容易导致潜在问题。...,相当于 waitpid (-1, status, 0);  当没有任何进程存在时,返回 -1,errno 设置为 ECHILD; waitpid 相对于 wait 优势在于: 可以指定子进程 (...当然,这个前提是在父进程同步 waitpid 之前进程没有结束;如果要等待进程先结束了,SIGCHLD 当然先被执行,这种情况下,建议先使用 sigprocmask 屏蔽 SIGCHLD 信号,...确实,没有多少人会有机会写一个 shell,但是并非只有 shell 才有混合使用同步、异步等待进程场景,考虑下面这个场景: 1 #include "..

2.4K30

Windows内核之进程终止和进程

它做事情: 全部打开句柄被关闭 全部线程会被终止 进程对象状态变为终止,满足全部等待进程结束线程 进程中全部线程对象状态变为终止,满足全部等待线程结束线程 ...进程终止状态由STILL_ACTIVE变为了进程返回代码 这个函数是异步,它告诉操作系统,你要终止某个进程,可是当函数返回时候,你无法保证进程是否已经被杀死,假设想要确切知道进程是否被杀死...2 进程终止时情况 进程中全部剩余线程将被终止 进程中指定用户对象,GDI对象被释放,内核对象被关闭 内核对象状态编程收到通知状态 进程退出代码由STILL_ACTIVE...3 进程 程序中要实现一段功能一共同拥有3种方法: 调用函数 开辟新线程 开辟新进程 3.1 调用函数 调用函数时很常见,可是它缺点是由于在同一个线程中...3.3 开辟进程 这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程代码。缺点是开辟新进程,会造成地址空间浪费。

1.7K20
  • python多进程编程-进程之间关系

    () # 进程 else: os.waitpid(pid, 0) # 父进程等待进程结束在上面的示例中,我们首先输出了父进程进程ID,然后创建了一个进程进程会输出自己进程...父进程在创建完进程之后调用了waitpid函数,等待进程结束。在父进程调用waitpid之前,进程会先输出自己进程ID,然后退出。...兄弟进程关系兄弟进程关系是指两个或多个进程之间没有父子关系,但它们通常是在同一时刻由同一个进程创建。在多进程编程中,这种关系通常是通过共享内存、消息队列等方式进行通信和同步。..._exit(0) os.waitpid(pid1, 0) # 父进程等待进程1结束 os.waitpid(pid2, 0) # 父进程等待进程2结束在上面的示例中,我们首先输出了父进程进程...进程1和进程2都会输出自己进程ID。父进程等待进程1和进程2都结束之后才退出。无关进程关系无关进程关系是指两个或多个进程之间既没有父子关系,也没有兄弟关系。

    36830

    深入Python多进程通信原理与实战——图文

    文件 使用文件进行通信是最简单一种通信方式,进程将结果输出到临时文件,父进程从文件中读出来。文件名使用进程进程id来命名。进程随时都可以通过os.getpid()来获取自己进程id。 ?...sums = [] for pid in pids: os.waitpid(pid, 0) # 等待进程结束 with open("%d" % pid...,但是本例进程是在同一个机器,用不着跨网络,使用普通套接字进行通信有点浪费。...socketpair返回两个套接字对象,一个用于读一个用于写,它有点类似于pipe,只不过pipe返回是两个文件描述符,都是整数。所以写起代码形式跟pipe几乎没有什么区别。...操作系统也提供了跨进程消息队列对象可以让我们直接使用,只不过python没有默认提供包装好api来直接使用。

    55920

    golang 服务平滑重启小结

    仍有流量没有处理完成老服务,需要等处理完成后再停服。...但是如果我们用了平滑重启框架,原来被 supervisor 启动进程发布重启 fork进程之后正常退出,当再次发布重启 fork 进程就会变成没有进程,那么,此进程就无法完成正常退出。...这样, defunct(僵尸进程) 问题就出现了。这个子进程无法完成退出原因是没有接受进程退出信号进程。同时,退出进程本身在defunct进程少量数据结构也无法销毁【内存泄露】。...由于进程id会随着不停发布 fork 进程而变化,所以需要将程序每次启动 PID 保存在一个文件中,一般大型分布式软件【mysql、zookeeper 等】都需要这样一个文件,目的就是为了拿到目标进程...id,然后做 waitpid ,但是当我们 fork 进程时候主进程会退出,os.waitpid 会收到退出信号,然后就退出了,但是这是个正常切换逻辑。

    1.6K20

    关于父进程进程关系(UAC 绕过思路)

    UAC(user account control),这里科普下UAC功能,事实UAC就是大家常见安装软件或者启动程序时候出现全屏变暗一个提示框,这里顺便提醒下大家不要把它提醒级别减少。...IceSworld,Process Explorer等) 查看时,会发现提权进程进程是创建它进程,这是由于AIS利用了CreateProcessAsUser() API中一个新功能,这里新功能就是将提权进程进程设置成创建该进程进程...这里事实是高兴太早。由于道高一尺。魔高一丈,要想真正搞清楚原理,还是继续往下看吧,这个新功能须要哪里查?...StartupInfo; PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; } STARTUPINFOEX, *LPSTARTUPINFOEX; 这里有个没有公开...事实在MSDN中还有个函数PsSetCreateProcessNotifyRoutine(), 这个函数就是设置监控回调函数,而且接受一个指向PS_CREARTE_NOTIFY_INFO结构指针,

    1.6K30

    深入理解Node.js进程进程

    但这么做意义是什么呢?因为 nodejs 并不适合计算密集型应用,一个进程就一个线程,在当下时间点,就一个事件在执行。那么,如果我们事件占用了很多 cpu 时间,那么之后事件就要等待非常久。...本文从以下几个方面介绍 child_process 模块使用:创建进程父子进程通信独立进程进程管道创建进程nodejs child_process 模块创建进程方法:spawn, fork...ChildProcess 对象,监听其 message 事件,来接受进程消息;调用 send 方法,来实现 IPC。...如果想让父进程先退出,不受到进程影响,那么应该:调用 ChildProcess 对象unref()options.detached 设置为 true进程 stdio 不能是连接到父进程main.js...这意味着可以通过监听其 data事件,在父进程中获取进程 I/O 。

    2K21

    golang 服务平滑重启小结

    从原理上讲,基于 linux fork 进程方式,启动新代码,再切换 listen socket FD,原理固然不难,但是完全自己实现还是会有很多细节问题。...但是如果我们用了平滑重启框架,原来被 supervisor 启动进程发布重启 fork进程之后正常退出,当再次发布重启 fork 进程后就会变成无主进程就会出现 defunct(僵尸进程) 问题...,原因就是此进程无法完成退出,没有进程来接受它退出信号,退出进程本身少量数据结构无法销毁。...由于进程id会随着不停发布 fork 进程而变化,所以需要将程序每次启动 PID 保存在一个文件中,一般大型分布式软件都需要这样一个文件,mysql、zookeeper 等,目的就是为了拿到目标进程...id,然后做 waitpid ,但是当我们 fork 进程时候主进程会退出,os.waitpid 会收到退出信号,然后就退出了,但是这是个正常切换逻辑。

    3.7K21

    golang 服务平滑重启小结

    从原理上讲,基于 linux fork 进程方式,启动新代码,再切换 listen socket FD,原理固然不难,但是完全自己实现还是会有很多细节问题。...但是如果我们用了平滑重启框架,原来被 supervisor 启动进程发布重启 __fork__进程之后正常退出,当再次发布重启 fork 进程后就会变成无主进程就会出现 defunct(僵尸进程)...问题,原因就是此进程无法完成退出,没有进程来接受它退出信号,退出进程本身少量数据结构无法销毁。...由于进程id会随着不停发布 fork 进程而变化,所以需要将程序每次启动 PID 保存在一个文件中,一般大型分布式软件都需要这样一个文件,mysql、zookeeper 等,目的就是为了拿到目标进程...id,然后做 waitpid ,但是当我们 fork 进程时候主进程会退出,os.waitpid 会收到退出信号,然后就退出了,但是这是个正常切换逻辑。

    93320

    C语言Linux系统编程-等待终止进程(僵死进程

    1.等待终止进程(僵死进程): 如果一个进程在父进程之前结束,内核会把子进程设置为一个特殊状态,处于这种状态进程称为僵死进程 当父进程获取了进程信息后,进程才会消失。...pid_t wait(int *status); 父进程调用这个方法会被阻塞住,如果子进程终止时候,此方法会调用并且返回终止进程pid #include #include <unistd.h...,pid=%d , ppid=%d ,我新建进程pid=%d\n",pid,ppid,ret); int status; int sonPid...,pid=22315 , ppid=12479 ,我新建进程pid=22316 我是进程,pid=22316 , ppid=22315 我进程,pid=22316,终止了 2.如果父进程进程之前终止了...,那么系统会把子进程设置给init进程(pid为1),init进程会周期性等待所有的进程,确保没有长时间僵死进程

    3.5K20

    python 学习笔记day10-pyt

    可以没有执行权限,程序在进程中执行,执行结束shell被销毁) 2.# ..../chdir.sh(fork,chdir.sh必须要有执行权限,程序在进程中执行,执行结束shell被销毁) 3.# . chdir.sh(当前进程执行脚本,没有fork进程) 4.# source...            僵尸进程没有任何可执行代码,也不能被调度             如果系统中存在过多僵尸进程,将因为没有可用进程号而导致系统不能产生新进程             对于系统管理员来说...wait()之间这段时间,进程被称为zombie(僵尸)进程             如果子进程没有终止,父进程先退出了,那么子进程会持续工作,系统自动将进程进程设置为init进程,init将来负责清理僵尸进程...查看stat  工作过程: 父进程进程分别运行,父进程sleep 30 s,进程sleep 10s,父进程没有处理进程代码,进程进入zombie状态,父进程sleep后,init进程回收父进程资源

    81330

    python fork()多进程

    fork()语义是建立在父进程对找出进程什么时候,以及如何终止感兴趣假定。...在进程终止和父进程调用wait()之间这段时间,进程被成为zombie进程。它停止了运行,但是内存结构还为允许父进程执行wait()保持着。...每当进程终止时候,它会向父进程发送SIGCHLD信号(信号是一个通知进程某些事件基本方法)。父进程可以设置一个信号处理程序来接受SIGCHLD和整理已经终止进程。...它有一个简单循环调用os.waitpid(),它第一个参数-1,意思是等待所有的已经终止子程序,而第二个参数是说如果没有已经终止进程存在,就立刻返回。...这个函数把子进程进程ID返回给父进程,还会把零值返回给进程。 当某个进程终止时候,除非该进程进程调用了wait()或waitpid(),否则终止信息会一直保持在系统

    2.1K20

    Golang杀死进程三种方式

    前言熟悉Golang语言小伙伴一定都知道,杀死进程有三种方式,今天就来简单介绍一下。...它们都是通过向进程发送信号方法来关闭进程。一、cmd.Process.Kill()cmd.Process.Kill() 是 os/exec 包中一个方法,用于终止一个进程及其所有进程。...二、syscall.Killsyscall.Kill 是一个系统调用函数,用于向进程发送信号。它可以向指定进程进程组发送信号,可以使用负进程 ID 来发送信号给进程组或进程组及其所有进程。...需要注意是,syscall.Kill 函数需要提供正确进程 ID,可以通过 cmd.Process.Pid 来获取已启动进程进程 ID。...需要注意是,cmd.Process.Signal 方法也需要提供正确进程 ID,可以通过 cmd.Process.Pid 来获取已启动进程进程 ID。

    1.5K00

    python之多进程fork

    python中os.fork()被调用后就会立即生成一个进程,是通过copy父进程地址空间和资源来实现进程创建,同时这个函数在进程中返回是0,在父进程中返回进程PID。...进程在结束父进程还未结束时候,进程这段时间是处于Zombie状态,可以通过ps命令查看到进程状态,Zombie目的是为了在进程结束时候可以保存一些结束信息供父进程来收集。...,进程和父进程执行顺序是无法预估。...进程结束后,但是父进程没有结束时候,进程是出于Zombie状态,这个需要父进程去收集子进程信息释放进程。如果父进程结束了进程没有结束,那么子进程就会寄托给pid为1进程来管理。 #!...第一个参数代表等待所有的进程终止,第二个参数代表如果没有已经终止进程就立即返回。

    1.1K20

    Linux 创建进程执行任务实现方法

    通常将原有的进程称为父进程,把新创建进程称为进程进程是父进程一个拷贝,进程获得同父进程相同数据,但是同父进程使用不同数据段和堆栈段。...在父进程中返回时返回值为进程 PID,而在进程中返回时返回值为 0,并且返回后都将执行 fork 函数调用之后语句。如果 fork 函数调用失败,则返回值为 -1。...为了防止父进程重写进程需要数据,父进程会被 vfork 调用阻塞,直到进程退出或执行一个新程序。...exec 族函数 使用 fork/vfork 创建进程后执行是和父进程相同程序(但有可能执行不同代码分支),进程往往需要调用一个 exec 族函数以执行另外一个程序。...调用这样函数时,可以由用户自行设定子进程环境变量,存放在参数 envp 所指向字符串数组中。 事实,只有 execve 是真正系统调用,其它五个函数最终都调用 execve。

    3.8K11
    领券