我用fork()和wait()系统调用在unix中编写了一个基本的c ++程序。我只创造了一个孩子。我用过两根管子。因此,在使用第一个管道进行fork操作后,我正在从子节点写入父节点,并且在父节点接收到数据之后,父节点将在第二个管道中写回子节点。在父方面之后我使用wait(0)系统调用。但是我的父进程在子进程之前仍然会死?
结构是这样的:
main()
char buff[] = "Parent process kills";
char cuff[] = "before Child process";
int fd1[2];
int fd2[2];
pipe(fd1);
pipe(fd2);
if((pid = fork()) == 0)
{
close(fd1[0]);
close(fd2[1]);
write(fd1[1],buff,strlen(buff)+1);
read(fd2[0],cuff,sizeof(cuff));
}
else
{
close(fd1[1]);
close(fd2[0]);
read(fd1[0],buff,sizeof(buff));
write(fd2[1],cuff,strlen(cuff)+1);
wait((int *) 0);
}
close(fd1);
close(fd2);
}'
即使使用了wait()但父进程仍然在子进程之前死亡。 谢谢你。
答案 0 :(得分:0)
您对read
的调用会导致未定义的行为。您尝试读取字符串文字,而不是您拥有的缓冲区。在这种情况下,它可能会导致崩溃。
您的write
调用也会写一个字符串文字而不是您拥有的缓冲区。
此外,由于您已将字符数组初始化为字符串,因此sizeo(buff)
和strlen(buff) + 1
相等。
答案 1 :(得分:0)
你确定你不会因为段错误而死吗?这些命令中的每一个都试图发送超出您的意图:
write(fd1[1],"buff",strlen(buff)+1);
和
write(fd2[1],"cuff",strlen(cuff)+1);
并且每个都试图接收到只读存储器:
read(fd2[0],"cuff",sizeof(cuff));
和
read(fd1[0],"buff",sizeof(buff));
答案 2 :(得分:0)
行
中有一个微妙的错误if(pid == fork())
您将fork()的结果与pid进行比较,而不是分配给它并将其与零进行比较。你想写的是:
if((pid = fork()))
请注意额外的一组括号,它们告诉编译器您确实想要进行分配,并且您不希望对其进行警告。
使用更正后的if,你让父进行第一种情况,而不是第二种情况,所以正确的代码是:
if(pid == fork()) {
close(fd1[1]);
close(fd2[0]);
read(fd1[0],"buff",sizeof(buff));
write(fd2[1],"cuff",strlen(cuff)+1);
wait((int *) 0);
} else {
close(fd1[0]);
close(fd2[1]);
write(fd1[1],"buff",strlen(buff)+1);
read(fd2[0],"cuff",sizeof(cuff));
}