获取子进程的数量有限制吗? 假设我的系统正在运行一个父进程和 500 多个子进程。
父进程正在阻塞模式下执行 waitpid(-1,status,0)。 我确实看到有时 waitpid 返回 -1。
如果 500 个子进程同时完成并向父进程报告其状态,是否会出现子进程被遗漏的情况?
最佳答案
当系统调用返回错误时(例如当waitpid
返回-1
时),请查阅errno
(通常通过perror
)如果您需要确定发生了什么错误。
根据我系统上的man 2 waitpid
,可能的错误非常有限:
ECHILD
:pid 指定的进程不存在或不是调用进程的子进程。 (如果将SIGCHLD
的操作设置为SIG_IGN,则自己的 child 可能会发生这种情况。
另请参阅有关线程的 Linux 注释部分。)EINTR
:未设置WNOHANG
,并且捕获了未阻塞的信号或SIGCHLD
;参见信号(7)。EINVAL
:选项参数无效。
此外,如果您为第二个参数传递了错误的地址,则可能会返回 EFAULT
。根据您所说的使用的代码,情况似乎如此。[1]
waitpid(-1,status,0)
应该是
waitpid(-1,&status,0)
如果您说错了或者解决此问题后仍然出现错误,则有两种可能:
- 该进程没有子进程。它可能创造的任何 child 都已经被收割了。
- 您设置了一个信号处理程序,并且在您等待子进程结束时收到了一个信号。只需再次调用
waitpid
即可。
- 始终启用编译器的警告,并像处理错误一样解决它们!对于
gcc
,我使用-Wall -Wextra -pedantic
。
关于Linux平台上C语言收割时子进程丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59937846/