首页
学习
活动
专区
工具
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都结束之后才退出。无关进程关系无关进程关系是指两个或多个进程之间既没有父子关系,也没有兄弟关系。

    37530

    golang 服务平滑重启小结

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

    1.6K20

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

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

    56120

    关于父进程和子进程的关系(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.7K30

    深入理解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

    linux~~监控子进程&创建新的线程

    wait函数的返回值; wait等待任意的一个子进程终止退出,如果子进程都不结束,wait将会一直处于一个阻塞的状态,有一个子进程终止,这个函数就会有对应的终止进程的返回值; 所有子进程全部终止结束,这个时候的...,我们可以称之为父进程,这个父进程创建了三个子进程,分别给这三个子进程创建休眠的时间,5s,10s,15s等等; 这个时候的main函数里面设置了相关的参数,其中这个里面的第一个参数就是argc,这个参数的意义就是我们的...main函数里面的参数的个数,第二个argv实际上就是我们的参数序列或者是指针,可以下去自行了解; 我们的这个for循环里面主要就是创建子进程(fork函数),打印这个子进程的id(getpid函数)和休眠时间...我们上面的这个过程也可以说明一个问题: 因为这个多个线程是并发执行的,就是同一个变量,两个线程之间是可以相互看到的,但是对于两个进程而言,如果也是同一个变量,两个进程之间是相互独立的,一个进程对于另外一个进程没有影响...因此,我们也可以看出来,这个线程之间想要保持通信其实并不难,因为他们的空间是一样的,但是对于进程而言,因为进程运行具有独立性,因此这个进程之间想要保持独立性,就没有线程之间那么简单!

    3700

    golang 服务平滑重启小结

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

    94220

    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进程回收父进程资源

    81830

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

    1.等待终止的子进程(僵死进程): 如果一个子进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程 当父进程获取了子进程的信息后,子进程才会消失。...pid_t wait(int *status); 父进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并且返回终止子进程的pid #include #include 的子进程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

    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.7K00

    python之多进程fork

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

    1.1K20

    python fork()多进程

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

    2.2K20
    领券