Linux平台上C语言收割时子进程丢失

标签 c linux fork

获取子进程的数量有限制吗? 假设我的系统正在运行一个父进程和 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 即可。
<小时/>
  1. 始终启用编译器的警告,并像处理错误一样解决它们!对于 gcc,我使用 -Wall -Wextra -pedantic

关于Linux平台上C语言收割时子进程丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59937846/

相关文章:

python - 当程序启动时运行Python脚本

linux - 如何抑制 tar 归档文件中的目录名称?

c - 如何在 if 语句中使用 fork()

c - Bash 脚本 vs. 编写 C 程序调用其他程序

c++ - endl 和\n 与 fork() 的不同行为

c - 仅包含头文件中的特定定义

c - 显示输入分数的最高/最低和平均值 - C 编程

c - `configure.ac` 文件给出错误

c - 在打印单链表时,在c程序执行结束时,它显示文件已停止工作

c - const 关键字是什么意思?