我需要经历许多短暂的生命过程.(但我不想等到它完成.让它运行.).一段时间后,我在执行fork时收到错误(errno==11).看起来派生的进程仍然存在(至少它们在HTOP中是可见的).

例如,请考虑以下示例.我想派生一个进程,然后在不久之后退出它.

#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

void RunProc(){   
    pid_t pid = fork();
    if(pid == 0)
    {
        puts("fork with success");
        //no needed to reproduce issue. Used in my code to run some commands.
        //execvp()             
        exit(0);
    }
    else if (pid == -1) {
        printf("Could not start process\n");
        printf("Errno: %d\n", errno);
    }
    else {
    }
}
 
int main()
{
    while(true){
        RunProc();
    }

    int res = 0;
    int i = 5;
    res = scanf("%d", &i);
    res = printf("End of program %d\n", i);
    return res;
}

一开始,它运行正常.几分钟后,我只收到错误:

无法启动进程 Errno:11

我再也不能开始新的fork 了. 我正在Ubuntu 22.04上运行它

推荐答案

您需要调用父进程中的the wait functions个中的一个,以便在子进程退出时获得子进程.

例如,您可以使用带有WNOHANG标志的waitpid来轮询子进程退出.或者使用SIGCHLD信号来获知子进程何时退出.

您的系统中只有有限数量的进程槽可用,如果您没有获得子进程,它们将填满所有的槽并导致您得到的错误.

正如the fork manual page人所说的EAGAIN错误:

遇到了系统对线程数量施加的限制.

Linux相关问答推荐

PERF显示不应该执行指令的内核的用户空间周期

为什么Read()和cin.get()对输出缓冲区的影响不同?

在不影响ROS2安装的情况下更新Ubuntu Linux中的CMake

使用sed命令将记录中的字符串替换为DD-MMM-YYYY日期格式

使用 sed 命令仅打印正则表达式匹配

8 个半小时范围的 Crontab 表达式

所有进程的Linux环境变量

我有 ext2 格式的文件系统图像.我喜欢在终端中读取 Linux 特别是 Ubuntu 中的所有文件系统 struct 数据.有没有工具>

问题:Virtio rpmsg 总线 virtio0:收到的 msg 没有收件人 - 在 Yocto Hardknott - imx7d-pico

如何在文本文件中向左移动特定单元格

编译过度对齐的动态分配变量时出现 icpc 错误

使用 Dockerfile RUN 执行某些操作但忽略错误

PHP factor 30 从 Linux 到 Windows 的性能差异

仅当当前行中存在字符串时才替换

如何告诉 valgrind 对Forking 进程进行 memcheck?

使远程目录保持最新

如何显示正在运行的进程列表 Python?

docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作

可以通过 SSH 连接的所有用户的列表

如何从 Linux 终端找到特定文件?