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

为什么我的程序在waitpid()中停止而没有任何错误信息?

在使用waitpid()函数时,程序停止而没有任何错误信息可能是由于以下几个原因:

  1. 子进程尚未终止:waitpid()函数用于等待子进程的终止,如果子进程尚未终止,调用waitpid()函数会导致程序阻塞。这种情况下,程序会一直等待子进程终止,直到子进程终止后才会继续执行。
  2. 子进程已经被其他进程回收:waitpid()函数会等待指定的子进程终止,如果子进程已经被其他进程回收,调用waitpid()函数时会返回错误码,但是没有具体的错误信息。这种情况下,可以通过检查返回值来确定子进程是否已经终止。
  3. 子进程被信号中断:如果子进程在waitpid()函数调用之前被信号中断,waitpid()函数会返回错误码,并且errno会被设置为EINTR。这种情况下,可以通过检查errno来确定是否是由于信号中断导致的错误。
  4. 错误处理不正确:在使用waitpid()函数时,需要正确处理错误情况。如果没有正确处理错误,可能导致程序停止而没有任何错误信息。可以通过检查返回值和errno来确定具体的错误原因,并进行相应的处理。

总结起来,程序在waitpid()中停止而没有任何错误信息可能是由于子进程尚未终止、子进程已经被其他进程回收、子进程被信号中断或者错误处理不正确等原因导致的。在使用waitpid()函数时,需要注意处理这些情况,以确保程序的正常执行。

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

相关·内容

wait和waitpid

Linux,wait 和 waitpid 是用于进程控制系统调用,它们主要用来让父进程等待子进程终止,并获取子进程退出状态。下面详细介绍它们用法和区别。...wait() 没有子进程时返回 -1 并设置 errno 为 ECHILD。...WNOHANG: 非阻塞模式,如果没有子进程终止,waitpid() 返回 0。 WUNTRACED: 还可以返回停止子进程(收到 SIGSTOP、SIGTSTP 等信号)。...(单个进程用法一样) status使用,waitpid第一个参数是自己子进程,不能等待别人子进程 子进程,一共有几种退出场景 不用全局变量,先在子进程改完,再从父进程拿到,这是不可以,...,在这个过程不断不断打电话询问,然后直接返回结果,立马挂断,叫做非阻塞,基于非阻塞然后一直给小张打电话(打电话不会被卡住),问他好了没有,这个过程就叫做轮询,所以非阻塞+循环就叫做非阻塞轮询。

8110

Linux:进程创建、终止和等待

遇到问题直接printf输出一下错误原因,或者是直接看结果不就可以了吗???  ——>没有人规定代码程序必须得打印!...除0错误:  野指针(段错误)  类似除0、野指针这样错误,会触发一些硬件级别的错误,比如除0,cpu状态寄存器会出现溢出错误,野指针,也就是们即将访问虚拟地址页表找不到对应映射,或者是建立映射关系只有只读权限...waitpid返回收集到子进程进程ID; 如果设置了选项WNOHANG,调用waitpid发现没有已退出子进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno会被设置成相应值以指示错误所在...(因为OS不相信任何人) 问题3:为什么int被分为好几个部分?? ...,调用waitpid发现没有已退出子进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno会被设置成相应值以指示错误所在;  调用出错,比方说等待不是自己子进程 3.2.4 多进程代码逻辑

15410
  • 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程理解…

    有的时候,我们写main函数时候,总是要写一个return 0,但是不写这个return 0好像程序运行起来又没有什么错误,这是为什么呢?...例如在开辟空间失败时,就会输出一句错误信息,malloc fail,这完全就是自定义错误信息,当然你也可以这么干!...exec系列函数只有调用失败时候才有返回值,这个返回值是-1,那为什么exec系列函数没有调用成功时返回值呢?...python,shell,c++这些程序都可以子进程中进行程序替换。 所以,程序替换,可以调用任何后端语言可执行程序。...模拟shell实现代码,cd到其他目录,pwd之后路径实际上是没有变化,因为pwd实际上pwd是父进程shell路径,父进程cwd路径始终是未改变执行cd命令是子进程,所以子进程

    14.8K30

    Linux孤儿进程和僵尸进程详解(wait和watipid)

    如果用比较新(旧版应该没有问题)桌面版Ubuntu会发现孤儿进程PPID并不是1,那么为什么图形化Ubuntu孤儿进程没有被init收养可以看下这篇博客:传送门,那么这里就用服务器版Ubuntu...僵尸进程        任何一个子进程结束后,并不是马上消失掉,实留下一些资源等待父进程处理,那么僵尸进程就是当子进程比父进程先结束,父进程又没有释放子进程占用资源,此时子进程将成为一个僵尸进程...那么为什么系统要让子进程结束时候等待父进程来处理其资源,不是直接结束呢?...当pid = -1时,等待任何一个子进程退出,那么此时waitpid函数和wait函数作用相同。         3. 当pid = 0时,等待和父进程相同进程组任何子进程。        ...系统一旦调用wait函数就会阻塞父进程来等待,直到子进程退出才停止阻塞,waitpid提供了非阻塞方式等待,也就是          WNOHANG参数。

    3.4K21

    【Linux】进程控制:理解什么是进程创建,进程终止,进程等待 | 进程替换

    函数 waitpid 函数一共有三个参数  pid: pid=-1,等待任何一个子进程。...即父进程会检查一次看子进程有没有退出,没有则返回0,此时父进程可以做一些自己事,不是一味等待子进程退出,子进程退出前循环以上过程,直到子进程退出,返回 >0 一个数,返回负数则表示等待失败...如果调用出错则返回-1 所以exec函数只有出错返回值没有成功返回值。...因为linux,环境变量内容是一个区域放着环境变量表 env 是环境变量地址,这些地址指向所对应环境变量;         而我们putenv一个环境变量时,其实是环境变量表找一个未使用下标...所以当我们要put环境变量时,只是将它地址填入了环境变量表环境变量内容是由我们自己输入我们自己创建命令行参数表,而这个命令行参数表是会变,但环境变量表依然指向不变,但是其实所指向内容已经变了

    31810

    L010Linux和androidNDK之linux避免僵尸进程,子进程退出处理

    L010Linux和androidNDK之linux避免僵尸进程,子进程退出处理 如果你程序fork出一个子进程,没有好好处理子进程退出后相关事宜,那么就有可能召唤出传说中进程界僵尸---僵尸进程...什么是僵尸进程 一个进程调用exit命令结束自己生命时候,其实它并没有真正被 僵尸进程销毁, 而是留下一个称为僵尸进程(Zombie)数据结构(系统调用exit,它作用是 使进程退出,但也仅仅限于将一个正常进程变成一个僵尸进程...,并不能将其完全销毁) 僵尸进程是怎么样产生 Linux进程状态,僵尸进程是非常特殊一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程退出状态等信息供其他进程收集...系统所能使用进程号是有限,如果大量产生僵死进程,将因为没有可用进程号导致系统不能产生新进程....); pid_t wait (int * status); 其中 wait(&status);等价于waitpid(-1, &status, 0); waitpid()会暂时停止目前进程执行,直到有信号来到或子进程结束

    3.1K40

    【Linux】进程控制

    【Linux】进程控制 1、进程创建 Linux创建进程的话通常也就两种方式,一个方法是创建可执行程序,然后通过我们./操作让进程创建。...还有一种方法就是程序代码过程写fork函数,再父进程状态下,创建子进程。...这种状况现实也有,就比如说,你去找工作,找到工作之后收到offer之后,对于那个公司来说,在你人还没有到公司报到时候,就已经算是创建好你档案了,只有在你真正抱到结束之后,才算是真正员工,这里报道...当为0时候表示成功,程序结束不需要知道什么别的消息,但是非0失败时候,就应该知道为什么程序会执行不到结果,为什么程序出现错误。...(上面的两种是阻塞等待) 如果设置了选项WNOHANG,调度waitpid发现没有已退出子进程可收集,则返回0,不过还需要后续重复等待(此时是非阻塞等待) 参数: pid: Pid=-1

    6610

    Linux: 关于 SIGCHLD 更多细节

    一个进程使用fork创建子进程,如果子进程退出,父进程并没有调用 wait 或 waitpid 获取子进程状态信息,那么子进程进程描述符仍然保存在系统。...父进程就能通过 wait/waitpid 来获悉这些状态了。 看起来有点意思,我们仿佛能借此做些有趣事情了。...其实wait是对waitpid封装,专门用来回收子进程退出信息,同样,它简单粗暴设置成了堵塞方式,如果没有任何子进程退出,那么就堵塞住。...waitpid功能非常强大,pid和options都提供了非常灵活用法: pid: < -1: 取该 pid 绝对值,如果任何子进程进程组ID等于该值,则该进程组任一子进程进程状态发生变化...操作系统上,也有很多利用这个工作,例如:后台进程,如果向标准输入读取内容时,是会被暂停 ? ? 为什么呢?

    2.8K60

    和老李一起搞山寨Workerman(三)

    php /* 子进程10s后退出,退出后父进程已然还在运行 但是父进程尚未做任何工作 所以按照定义,子进程将会成为僵尸进程. */ $i_pid = pcntl_fork(); if ( 0...随着篇幅继续,主要矛盾由僵尸进程产生逐步转移到了如何解决僵尸进程。PHP则是由pcntl_wait()和pcntl_waitpid()两个函数来解决。...在此需要向诸君说明一个进程[ 终止 ]和[ 停止 ]是两个决然不同概念,[ 终止 ]意味着进程君生命周期已经完成,或正常完成或者异常终止;[ 停止 ]意味着临时挂起,还会复活继续活动。...如有,可曾观察程序" 是否停止:true "恢复为" 是否停止:false "?事实上是没有恢复,何故?...WCONTINUED选项相关资料可见于APUE 242页 ] 篇章即将结束前夕,我们需要重新认识一下WNOHANG,此参使得pcntl_wait()亦或pcntl_waitpid()尚未遇到任何子进程生命周期完成时马上返回

    1.1K61

    Linux进程控制

    进程拥有独立性,fork之后就变成了两个程序,父子进程共享后边代码。 那么为什么给父进程返回就是子进程pid,给子进程返回就是0呢?...进程终止 退出码 写C/C++时候,我们main函数是程序开始,但是最后一个位置会写return 0; 这也就代表一个程序退出,至于为什么要写return 0,不是返回其他,亦或者是不写都可以...这个之前用过: 然后来看看里面数字对应错误信息 注意:如果程序异常退出码也无意义。 常见退出方式 上面说了mian函数调用return就是进程退出。...替换原理 一个可执行程序被首先被加载到内存,然后执行代码,然后代码中有操作让本程序执行一个新程序,这个时候就会将指定执行程序代码和数据覆盖掉原本代码和数据,整个过程没有产生新进程,...但是如果我们输入cd …就会发现根本没有任何变化,这是为什么呢?

    2.9K00

    僵尸进程

    UNIX 系统,一个进程结束了,但是他父进程没有等待(调用wait / waitpid)他,父进程还没有结束,那么他将变成一个僵尸进程.    ...,成为他父进程,从而保证每个进程都会有一个父进程.Init进程会自动wait其子进程,因此被Init接管所有进程都不会变成僵尸进程. 2.子进程结束后为什么要进入僵尸状态?    ...任何一个子进程(init除外)exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)数据结构,等待父进程处理。这是每个 子进程结束时都要经过阶段。...如果子进程exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程状态是“Z”。...如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以handler调用wait回收     3.

    1.4K50

    为什么docker容器刚启动就停了

    ,都是这个进程子进程,所以,整个系统用户进程,都是由init进程作为根进程 要了解这个PID1进程,要从以下几个概念了解 进程表项 linux内核程序通过进程表对进程进行管理, 每个进程进程表占有一项...但是,这里要注意是,进程表项并没有随着进程退出被清除,它会一直占用内核内存。为什么会有这么奇怪行为呢?...这是因为某些程序,我们必须明确地知道进程退出状态等信息,而这些信息获取是由父进程调用wait/waitpid获取。...,上面说linuxPID1进程为所有用户进程父进程,但是容器里面,通过ps命令看到进程父进程都是“0”,这又是为什么呢?...,自己就先退出去了,所以我们上面的过程中一直没有出现 看到这里你应该了解,为什么你启动容器或写好dockerfile,总是刚启动就退出,而且没有任何错误了吧!

    3K10

    Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待)

    当CPU执行进程指令时,它会根据程序计数器值来获取下一条要执行指令虚拟地址 进程地址空间实质 代码和数据实际上是存储物理内存进程空间(或称为虚拟地址空间)里存储是代码和数据虚拟地址...它接受一个整数参数errno,返回一个指向错误信息字符串指针。strerror函数头文件string.h, errno是一个全局变量,用于C语言中表示发生错误时错误码。...strerror函数会根据错误码系统错误码表查找对应错误信息,并将其作为字符串返回。...,然后才退出 _exit()则直接退出,不会执行这些清理工作,也不会将缓冲区内容写入文件 4.2.2异常退出 使用ctrl + c,能使异常信号终止 进程最终执行情况 Linux系统任何进程最终执行完毕后都会返回一个状态码...options 参数设置了 WNOHANG,并且没有已退出子进程可收集,则 waitpid 返回0。

    13000

    【Linux】进程详解:进程创建&终止&等待&替换

    注意 return 和 exit 区别 exit()函数和return功能差不多,但是exit()在任何地方只要被调用,就会立即退出进程 只有main()函数return才会退出进程,exit...返回收集到子进程进程ID; 如果设置了选项 WNOHANG ,调用 waitpid 发现没有已退出子进程可收集,则返回0; 如果调用中出错,则返回 -1,这时 errno 会被设置成相应值以指示错误所在...,并没有创建一个新进程 只是原来进程基础上,进程物理内存中代码和数据被另一个进程代码和数据段所替换而已。...其余数据结构类似PCB,mm_struct,页表等等结构并没有改变。 子进程进行程序替换之后,父进程代码段和数据段并没有受到任何影响。...p(path):表示执行程序可以自动环境变量PATH自动搜索可执行程序路径, 没有 p 需要指定路径 有p会默认到 path 环境变量指定路径下寻找。

    23810

    Linux进程控制——Linux进程等待

    进程等待必要性 了解完进程等待概念后,新问题出现了,我们为什么要进行进程等待,进程等待必要性是什么?...,exit code 将无任何意义 exit sig : 0则代表没有收到信号 手动杀掉子进程也会获取到信号 但是如果我们每次提取退出信息都要使用繁琐位运算,这很不方便,因此系统给我们做了一个简单封装...,但是调度时却没有顺序可言,终止时候也没有顺序,因为进程调度完全由调度器说算,所以进程调度先后我们并不确定,这点在前面我们也提到过。...总结拓展 拓展一:父进程如何得知子进程退出信息 父进程调用wait()/waitpid()来获取子进程退出信息,调用接口就传入了一个status参数,父进程存在着一个statusp指针...子进程退出时,操作系统就会将退出信号和退出码写到子进程PCD int exit_code; int exit_signal 退出信号和退出码将会写到这两个变量, 当我们调用系统调用时,只需要将这两个变量组合写入到变量里

    10810

    Qt下使用fork创建进程并使用socket通信

    之前嵌入python解释器过程,我们没有处理这样一种情况:当Python解释器正在执行一个阻塞操作(比如socket server 监听一个客户端连入),这时我们需要终止解释器运行,该如何操作呢...Qt线程不容易实现该功能,如果在socket 监听时终止python解释器,那么再次运行时端口就会显示被占用,因为资源没有清理。为了解决这种情况,我们让解释器运行在一个进程。...这样需要停止时,我们可以发送kill信号终止进程。...processServer->listen(QHostAddress::Any, 8866)) { //监听本地主机8866端口,如果出错就输出错误信息,并关闭...简单介绍下程序主体构成:构造函数中使用c创建客户端,使用Qt类创建服务器。 界面点击start按钮时,使用fork创建子进程,进程客户端向服务器发送数据。

    1.7K30

    C语言 进程

    进程地址空间图片环境变量:图片libc定义全局变量environ指向环境变量表,environ没有包含在任何头文件,所以使用时要用extern声明。...任何进程刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。如果一个父进程终止,子进程还存在(这些子进程或者仍在运行,或者已经是僵尸进程了),则这些子进程父进程改为init进程。...带子进程终止信息立即返回(如果一个子进程已终止,正等待父进程读取其终止信息)。出错立即返回(如果它没有任何子进程)。...0),仍然有进程从管道读端读数据,那么管道剩余数据都被读取后,再次read会返回0,就像读到文件末尾一样.如果有指向管道写端文件描述符没关闭(管道写端引用计数大于0),持有管道写端进程也没有向管道写数据...如果有指向管道读端文件描述符没关闭(管道读端引用计数大于0),持有管道读端进程也没有从管道读数据,这时有进程向管道写端写数据,那么管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回

    1.2K10

    【Linux】进程控制

    另外,为什么 fork 给父进程返回子进程 pid,给子进程返回0呢?...,一般来说: 0表示进程运行结果正确; 非0表示运行结果错误; 对于非0来说,不同数字有又对应着不同错误,我们可以自己设定不同退出码所对应错误信息,也可以使用系统提供退出码映射关系: ...最后打印了 “hello linux”, _exit 什么都没有打印;所以 exit 终止程序后会刷新缓冲区, _exit 终止程序后不会刷新缓冲区; 最后,由于 exit 底层是 _exit...第二个参数为如何执行我们程序,这里我们只需要记住: Linux 命令行程序如何执行我们就如何传参 即可;需要注意是,命令行多个指令是以空格为分隔一整个字符串, exec 我们需要对不同选项进行分割...: 要理解并解决这个问题,我们首先要理解什么是当前路径;下面举例说明: 可以看到,当 test 程序运行起来后,其系统中一共有两个路径,其中 exe 路径是指 test 可执行程序磁盘路径

    4.1K00

    僵尸进程处理办法

    articleId=138925446这篇文章缺失了关于僵尸进程处理办法内容,因为当时脑子不好小菜鸟并未学到这里,现在就让填上这个坑吧 引入 知道僵尸进程处理办法之前,请让我们思考以下问题...答案:使用wait或者waitpid函数 wait和waitpid函数介绍 Linux怎么查函数手册呢?...如果得到值是非0:非正常退出 如果是终止信号非0,则是由于程序崩溃终止进程,代码并没有执行完,且我们就可以通过**kill -l**来知道该信号是因为什么原因而退出了 如果是退出码非...0,则是程序运行完了,但是结果不正确终止进程**代码执行了,我们就可以通过查看perror**各个返回值来得知是什么原因 结语 其实status有32位,但是僵尸进程这一块我们只需要研究低16位就好了...,所以该篇文章只涉及了低16位,对更多感兴趣,大家可以自行查阅 waitpid部分,写了status构成,示意图中被信号所杀情况下第8位是core dump标志,这是gdb调试崩溃程序信号

    5500

    Linux进程控制

    那么,为什么会这样?接下来我们好好地讨论一下fork函数。 linuxfork函数时非常重要函数,它从已存在进程创建一个新进程。新进程为子进程,原进程为父进程。...为什么是0,不是1,不是2等等。 其实return 00,就是退出码意思,return 0,标定进程退出结果是否正确。...; 如果设置了选项WNOHANG,调用waitpid发现没有已退出子进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno会被设置成相应值以指示错误所在; 参数: pid:...所以我们回到上面的那个问题,为什么第二个printf没有执行? 答案就是:因为第二个printf是execl之后执行了execl后,第二个printf被覆盖掉了,所以也就没办法执行了。.../my_exec","my_exec",NULL,environ); 结果发现,没有了自定义环境变量  那么,想把自定义和系统自带环境变量都输出:使用putenv函数,将自定义环境变量导入系统环境变量表

    2.4K30
    领券