如何同时运行子进程?在c

时间:2015-10-09 20:25:36

标签: c fork

所以这是我的代码,它将int作为命令行参数然后fork N子进程(同时运行)。然后,当每个孩子结束时,父母将回应孩子那个孩子退出状态。

但是现在我只能按孩子做孩子但不能同时做孩子。我该怎么办?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>

int main ( int argc, char *argv[] )
{
    int i, pid, ran;

    for(i = 0; i < atoi(argv[1]); i++) {
    pid = fork();
    srand(time(NULL));
    ran = (rand() % 10) + 1 ;

     if (pid < 0) {
        printf("Error");
        exit(1);
     } else if (pid == 0) {
        printf("Child (%d): %d\n", i + 1, getpid());
        printf("Sleep for = %d\n", ran);
        sleep(ran);
        exit(ran); 
     } else  {
        int status = 0;
        pid_t childpid = wait(&status);
        printf("Parent knows child %d is finished. \n", (int)childpid);
     }
  }

}

1 个答案:

答案 0 :(得分:2)

您正在循环中调用wait()您正在产生孩子的循环,因此它不会继续循环以启动下一个孩子,直到当前孩子完成为止。

您需要在循环外调用wait()

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>

int main ( int argc, char *argv[] )
{
    int i, pid, ran;

    for(i = 0; i < atoi(argv[1]); i++) {
        pid = fork();
        srand(time(NULL));
        ran = (rand() % 10) + 1 ;

         if (pid < 0) {
            printf("Error");
            exit(1);
         } else if (pid == 0) {
            printf("Child (%d): %d\n", i + 1, getpid());
            printf("Sleep for = %d\n", ran);
            sleep(ran);
            exit(ran); 
         }
    }

    for(i = 0; i < atoi(argv[1]); i++) {
        int status = 0;
        pid_t childpid = wait(&status);
        printf("Parent knows child %d is finished. \n", (int)childpid);
    }
}