我有一个简单的程序,用叉子和管子制作,用于学习目的。我希望一个将ppid发送给父级的孩子输出ppid的值,并执行两次。但是,结果是两个ppid输出是相同的。为什么?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main()
{
  int   fd[2];  /* for the pipe */
  int   n,pid,ppid,val;
  int   p[5],q[5];

  if (pipe(fd) < 0) {
     printf("Pipe creation error\n");
     exit(1);
  }
  for(val=0;val<2;val++){
    pid = fork();
    if (pid < 0) {
        printf("Fork failed\n");
        exit(1);
    } else if (pid == 0) { /* child */
        ppid = getpid();
        printf("child %d pid:%d \n",val+1,ppid);
        write(fd[1], &ppid, sizeof(ppid));
        sleep(1);
        close(fd[1]);

    } else { /* parent */
   //printf("Parent: pid: ");
        close(fd[1]);
        printf("%d \n",val+1);
        sleep(1);
        n = read(fd[0], &ppid ,sizeof(ppid));
        printf("%d \n",ppid);

        // fflush(stdout);
        close(fd[0]);
        wait(NULL);
        // printf("<parent> I have completed!\n");
        exit(0);
    }
  }
}

最佳答案

程序设计中可能存在潜在问题。因为父母在等孩子
在第一次迭代中,子代执行val = 1的for循环并生成另一个进程
通过叉子。最终有三个过程,其中两个将具有相同的pid
因为其中之一执行了两次。

10-08 03:51