-2

我正在阅读一本关于操作系统的书,并且对 C 编程也相当陌生(往往会使事情复杂化),但我很好奇为什么当每个孩子都是通过 fork() 创建时我不能打印递增的 i 值。它与子进程或其他东西有关吗?提前致谢。

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

int main ()
{
    pid_t pid;
    int i = 1;

    pid = fork();
    pid = fork();
    pid = fork();
    pid = fork();

    if (pid == 0) {
        printf("got child %d\n", i);
        i++;
    }
}
4

4 回答 4

2

使用getpid()andgetppid()作为父子进程 ID。

例子在这里

int main()
{

        int i;
        printf("hello before fork \n");
        printf("i : %d\n",i);

        i=fork();
        printf("\n");

        if(i==0)
        {

                printf("Child has started\n\n");
                printf("child printing first time \n");

                printf("getpid : %d getppid : %d \n",getpid(),getppid());
                sleep(5);
                printf("\nchild printing second time \n");
                printf("getpid : %d getppid : %d \n",getpid(),getppid());
        }
        else
        {
                printf("parent has started\n");
                printf("getpid : %d  getppid : %d \n",getpid(),getppid());
                printf("\n");

        }

        printf("Hi after fork i : %d\n",i);

        return 0;


}

输出:

[04mca8@LINTEL pp]$ ./a.out 你好前叉 i : 134514088

孩子开始了

孩子第一次打印 getpid : 8354 getppid : 8353

父母已经开始 getpid : 8353 getppid : 5656

分叉后您好:8354 [04mca8@LINTEL pp]$ 子打印第二次 getpid:8354 getppid:1 分叉后您好:0

于 2012-09-17T14:52:50.313 回答
1

您无法打印增加的值,因为i在增加后未打印。分离出来的进程fork()不共享资源,它们每个都得到一个独立的i. 所以你会看到:

got child 1

一遍又一遍。试试这个调整,你会看到每个子进程都以相同的值进入条件:

int main () {
  pid_t pid;
  int i = 1;
  pid = fork();
  pid = fork();
  pid = fork();
  pid = fork();
  if (pid == 0) {
     printf("the child %d, got %d\n", getpid(), i);
     i++;
  }
}
于 2012-09-17T14:53:24.093 回答
1

每个父/子都有一个单独的内存堆栈,因此每个人都会获得自己i设置的版本。所以printf将只打印 1 - 即其中的 16 个。

使用getpidgetppid

于 2012-09-17T14:54:28.903 回答
1

您的代码根本没有任何意义。

  1. 每次调用fork()都会在此时创建一​​个新进程。
  2. 然后,这两个进程中的每一个都将在fork().
  3. 这意味着您的第二个fork()将由两个进程调用;原来的一个和第一个创建的孩子fork()
  4. 等等。
  5. 你覆盖pid了很多次,然后检查它是否为 0。
  6. 您 print i, not ,并在打印pid递增它,这将无效。

请进一步研究这些东西,您似乎有些困惑。

于 2012-09-17T14:55:29.217 回答