我有一个简单的程序,用叉子和管子制作,用于学习目的。我希望一个将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
因为其中之一执行了两次。