6

你如何使用 fork() 命令来生成 10 个进程并让它们同时执行一项小任务。

并发是一个有效的词,许多展示如何使用 fork 的地方在他们的演示中只使用一次 fork() 调用。我以为你会使用某种 for 循环,但我试过了,在我的测试中似乎 fork() 正在产生一个新进程,开始工作,然后产生一个新进程。所以它们似乎是按顺序运行的,但是如果有意义的话,我怎么能同时分叉并让 10 个进程同时完成工作呢?

谢谢。

更新:感谢大家的回答,我想我最初只是误解了 fork() 的某些方面,但我现在明白了。干杯。

4

4 回答 4

15

fork()循环调用:

添加代码以等待每个评论的孩子:

int numberOfChildren = 10;
pid_t *childPids = NULL;
pid_t p;

/* Allocate array of child PIDs: error handling omitted for brevity */
childPids = malloc(numberOfChildren * sizeof(pid_t));

/* Start up children */
for (int ii = 0; ii < numberOfChildren; ++ii) {
   if ((p = fork()) == 0) {
      // Child process: do your work here
      exit(0);
   }
   else {
      childPids[ii] = p;
   }
}

/* Wait for children to exit */
int stillWaiting;
do {
   stillWaiting = 0;
    for (int ii = 0; ii < numberOfChildren; ++ii) {
       if (childPids[ii] > 0) {
          if (waitpid(childPids[ii], NULL, WNOHANG) != 0) {
             /* Child is done */
             childPids[ii] = 0;
          }
          else {
             /* Still waiting on this child */
             stillWaiting = 1;
          }
       }
       /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */
       sleep(0);
    }
} while (stillWaiting);

/* Cleanup */
free(childPids);
于 2009-09-04T19:33:20.513 回答
4

当您分叉进程时,将同时运行。但请注意,除非您有足够的可用空闲处理器,否则它们实际上可能不会同时执行,这并不重要......

您的第二段似乎您不了解 fork 的工作原理,您必须检查返回码以查看您是在父进程中还是在分叉进程中。因此,您将让父进程运行一个循环来分叉 10 个进程,并在子进程中同时执行您想做的任何事情。

于 2009-09-04T19:32:11.063 回答
3

只需在“主”过程中循环,一个接一个地产生一个孩子,每个孩子分配一个特定的任务。

于 2009-09-04T19:31:42.187 回答
0

您可能还想查看 POSIX 线程(或 pthreads)。这是一个教程:

https://computing.llnl.gov/tutorials/pthreads/

于 2009-09-05T03:19:48.850 回答