首页
学习
活动
专区
工具
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的第一个参数是自己的子进程,不能等待别人的子进程 子进程,一共有几种退出的场景 而不用全局变量,先在子进程改完,再从父进程中拿到,这是不可以的,...,在这个过程中,我在不断不断的打电话询问,然后直接返回结果,立马挂断,叫做非阻塞,基于非阻塞然后一直给小张打电话(打电话不会被卡住),问他好了没有,这个过程就叫做轮询,所以非阻塞+循环就叫做非阻塞轮询。

10310

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

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

19710
  • 【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.9K30

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

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

    3.5K21

    Linux进程控制

    代码执行成功,程序能够执行到main函数的末尾并返回,而不是说程序中的每一行都按预期执行了,因为有些错误不能被捕获或者导致程序提前退出了。...2.4错误码 为了获取普通函数的错误信息,操作系统提供了错误码这个接口 errno是错误码,它是记录系统最后一次错误代码的一个整数值,不同值表示不同含义,在#include中定义...0 进程没有正常运行,退出码没有任何意义 2.6.进程退出的方式 2.6.1.正常退出 就是在正常的程序代码中,如main函数走到结尾,或者是遇到return。这样的正常结束。...如果指定的环境变量已经存在,那么它的值会被新的字符串中的值所替换;如果指定的环境变量不存在,那么它会被添加到环境变量表中。 5.2.为什么子进程进行替换,父进程无任何影响?...exec函数的行为:仅在调用它的进程中生效,而不会影响到父进程。由于exec函数是在子进程中调用的,因此只有子进程的映像被替换,父进程的映像保持不变,父进程继续执行其后续代码。

    9510

    详谈 Linux进程控制(看这一篇就够了)

    进程创建 ✨1. fork函数的认识 在linux中fork函数非常重要, 它从已存在的进程中创建一个新的进程, 新进程为子进程,而原进程为父进程。...如果想知道具体的错误内容, 可以使用strerror函数,参数传递错误码。 举个例子: 我们可以将错误码和对应的错误信息进行打印: 例如: 2.2 exit函数 在代码的任何地方, 让进程直接结束。...2.4 缓冲区问题补充(为什么_exit不刷新缓冲区) exit属于是语言级别的,在三号手册, 而_exit是系统级别的,在二号手册。...举个例子: 等待任何一个子进程 当然, 我也可以修改id的参数,比如更换为刚刚子进程id,这里就不展示了。...,不再返回 如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。

    12810

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

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

    33810

    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

    7110

    Linux: 关于 SIGCHLD 的更多细节

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

    2.9K60

    【Linux】深入理解进程控制:从创建到终止和进程等待

    fork函数特点: 返回值: 在父进程中,fork 返回子进程的 PID(进程ID)。 在子进程中,fork 返回 0。 如果发生错误,fork 返回 -1,并且不会创建新进程。...但是为什么返回0就是成功非零就是失败呢?----因为不同的数字代表不同的错误信息,系统提供了一批错误码来控制。...错误信息 在C语言中我们通常用一个全局变量来代表最近一个进程的错误码: 当我们创建子进程的时候也有创建失败的时候,所以当创建失败时,我们可以利用errno将错误信息打出,然后返回错误码给父进程。...还有: 这个的错误码并不是3,是因为kill杀死这个进程失败了,返回1,错误码输出的就是1了。 exit exit在程序的任何地方表示进程结束。...此外,我们还分析了父子进程之间的关系以及信号处理在进程控制中的重要性。 掌握进程控制不仅有助于提升对Linux操作系统的理解,更是编写高效和可靠程序的基础。

    17110

    Linux系统编程:进程控制(创建,终止,等待)

    查看上一个进程的退出码 1.在main函数中return 2.调用exit 3.调用_exit 2.2main函数返回值 main函数虽然是主函数,但毕竟也是个函数,最后的返回值即使告诉操作系统是否正常结束...printf虽然可以检查错误,但是没有人规定检查错误必须用printf; 错误码适合计算机看,而字符串错误信息是给人看的;所以我们通常将其转化为字符串; 3.父进程为啥要关心子进程的状态?...——>因为如果在内核区的话,系统调用的_exit在终止的时候也必然会把缓冲区刷新一下,因为现代操作系统不做任何浪费时间和空间的事情,所以肯定不是由内核维护缓存区,而是由用户区在维护!!...(_exit压根看不到缓冲区,所以这个工作只能有exit去完成) 2.6 异常终止 一旦程序发生异常那么就程序就会直接中断,但是异常是事先知道异常的条件的,比如不能/0,一旦异常那么就不会正常接收退出码了...,且退出码也不再有意义; 就比如,我们平时考试一样,考试的好不好是一回事,作弊被逮到是一回事,一旦发生那就不会有结果了; 野指针 野指针其实就是非法访问了内存空间->虚拟地址在页表中找不到,或者全是是只读

    10710

    和老李一起搞山寨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

    C语言进程(第二章,wait,sleep,waitpid,pthread_mutex_lock,pthread_mutex_unlock)

    ,waitpid,pthread_mutex_lock,pthread_mutex_unlock,函数在进程中的使用,还有经典的生产者消费者等问题的讲解。...返回值是已终止子进程的 PID (如果有),或 -1(如果没有任何子进程) 父进程调用 wait() 函数会被阻塞,直到任一子进程结束运行。...需要注意的是,在调用 sleep() 函数之前,应该保证其他的进行不会对代码执行造成影响。 否则,程序可能因等待时间过长而超时或得不到响应等意外情况。...具体而言, pthread_mutex_lock() 的功能如下: 如果该互斥量还没有被任何线程持有,它将分配给现在的线程,并向该线程返回 0。...在本示例中,在缓冲区的访问上使用互斥锁可以对竞态条件进行保护。调用 pthread_mutex_lock(&mutex) 时,如果锁当前未被任何线程占据,则获得互斥锁,并开始执行代码块中的语句。

    8910

    Linux进程控制

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

    2.9K00

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

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

    3.1K10

    僵尸进程

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

    1.4K50

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

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

    16100

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

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

    38410
    领券