Fork() 和 execv() 不是 运行 并行,为什么?

Fork() and execv() not running in parallel, why?

我正在尝试 运行 通过 execv() 执行一系列命令,并在 C 中为每个 运行 分叉一个新进程,但由于某些原因它们不是 运行并联。以下代码是每个进程的 运行,“full”是文件路径,“args”是参数。我知道 execv() 部分不是问题,它与我分叉和等待的方式有关。

            int status;
            pid_t pid = fork();

            if (pid == 0) {
                execv(full, args);
                //perror("execv");
            } else if (pid < 0) {
                printf("%s\n", "Failed to fork");
                status = -1;
            } else {
                if (waitpid(pid, &status, 0) != pid) {
                    status = -1;
                    return status;
                }
                
            }

当 运行 执行此代码时,分支命令只是 运行 一个接一个地执行。我不知道这怎么会发生。

如果不想等待每个child进程,不要立即调用waitpid;正如所写,你 fork 一个 child,然后 立即 停止 parent 中的所有处理,直到 child 进程退出,阻止你不再分叉 children。如果你想启动多个 children 而不留下僵尸进程(并且可能在某个时候监视它们以确定它们的退出状态),你可以执行以下操作之一:

  1. 将每个 forkpid 存储在一个数组中,并在启动所有需要启动的进程后对它们一一调用 waitpid
  2. 存储成功启动的 child 个进程的计数并调用 wait 多次以等待它们以它们完成的任何顺序。
  3. Ignore the SIGCHLD from the child processes entirely,因为当你不关心他们什么时候退出,不需要知道他们的状态等等