【问题标题】:fork() and children of original parent processfork() 和原始父进程的子进程
【发布时间】:2016-03-04 06:27:33
【问题描述】:

我编写了一个使用 fork() 创建多个进程的程序。现在我正在努力做到每次调用 fork() 时,只有原始父进程产生子进程。例如,如果我给出 4 的参数,我应该让所有 4 个 ppid 及其子级都相同。

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

int main(int argc, char **argv) {

    int i;
    int n;
    int num_kids;

    if(argc != 2) {
        fprintf(stderr, "Usage: forkloop <numkids>\n");
        exit(1);
    }

    num_kids = atoi(argv[1]);

    for(i = 0; i < num_kids; i++) {
        n = fork();
        if(n < 0) {
            perror("fork");
            exit(1);
        } else if (n == 0) {
            exit(i);
        }
        printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
    }

    return 0;
}

当我运行它时,每个 ppid 都是相同的,但每个子 pid 也是相同的。如果我给出 4 作为我的论点,我会得到:

pid = 19765, ppid = 18449, i = 0
pid = 19765, ppid = 18449, i = 1
pid = 19765, ppid = 18449, i = 2
pid = 19765, ppid = 18449, i = 3

孩子的pid应该都一样,还是我的代码有问题?

【问题讨论】:

  • 子进程马上退出,做这些打印输出的进程是父进程(每次都是同一个进程)。
  • 请不要破坏您的问题。

标签: c process fork


【解决方案1】:

不要与fork()的返回值混淆:

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

int main(int argc, char **argv) {

    int i;
    int n;
    int num_kids;

    if(argc != 2) {
        fprintf(stderr, "Usage: forkloop <numkids>\n");
        exit(1);
    }

    num_kids = atoi(argv[1]);

    printf("parent pid = %d\n", getpid());
    for(i = 0; i < num_kids; i++) {
        n = fork();
        if(n < 0) {
            perror("fork");
            exit(1);
        }
        else if (n == 0) { // child process
            printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
            exit(i);
        }
    }

    return 0;
}

输出:

parent pid = 54981
pid = 54982, ppid = 54981, i = 0
pid = 54983, ppid = 54981, i = 1
pid = 54984, ppid = 54981, i = 2
pid = 54985, ppid = 54981, i = 3

【讨论】:

    【解决方案2】:

    This 链接为您解释事情。

    在你写这行的时候

     printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
    

    这一行是由父进程而不是子进程处理的。 变量“n”存储fork创建后的返回值(创建成功时为0)。所以为了得到孩子的进程ID,你必须把你的代码拿出来

    else if (n == 0) {  //child process
            exit(i);
        }
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <sys/types.h>
      

      标题顺序不正确。 sys/ 标头不仅应该始终放在第一位,getpid 和 getppid 的手册页还专门将 sys/types.h 放在 unistd.h 之上。

      int main(int argc, char **argv) {
      
          int i;
          int n;
          int num_kids;
      
          if(argc != 2) {
              fprintf(stderr, "Usage: forkloop <numkids>\n");
              exit(1);
          }
      
          num_kids = atoi(argv[1]);
      
          for(i = 0; i < num_kids; i++) {
              n = fork();
      

      n 对孩子的 pid 来说是个坏名字。

              if(n < 0) {
                  perror("fork");
                  exit(1);
              } else if (n == 0) {
                  exit(i);
      

      不正确。应该是_Exit。

              }
              printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
      

      此行由您的原始进程执行。也许你想在孩子身上执行它。但孩子只是退出了。 }

          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多