我有一段代码,我试图改变。代码只是两个管道,它们在两个进程(父进程和子进程)之间进行通信。我正在尝试创建程序的“干净终止”,以便无论何时从父级发送0到子级,相应的进程都会关闭所有管道的末端。如何正确关闭管道
的代码是一样的东西:
int main
{
int pipe1[2], pipe2[2], value, request;
if(pipe(pipe1) < 0 || pipe(pipe2) < 0)
printf("Failed to create pipes.\n");
switch(fork())
{
case -1:
perror("Cannot create fork.\n");
break;
case 0:
close (pipe1[WRITE]);
close (pipe2[READ]);
close (0);
close (1);
for(;;) {
read(pipe1[READ], &value, sizeof value);
//If user enters 0.
if(value == 0)
{
printf("Terminating child process!\n");
close(pipe1[READ]);
//write a 0 back to the parent so that it can close its end.
write(pipe2[WRITE], 0, sizeof (int));
close(pipe2[WRITE]);
exit(0);
}
else
{
/*Enter function to do something on the number here*/
write(pipe2[WRITE], &result, sizeof result);
}
}
break;
default: /* PARENT PROCESS - PRODUCER */
close(pipe1[READ]);
close(pipe2[WRITE]);
for(;;) {
printf("Ange ett tal: ");
scanf("%d", &value);
if(write(pipe1[WRITE], &value, sizeof value) != sizeof value)
{
perror("Cannot write thru pipe.\n");
return 1;
}
//Clean shutdown if value == 0
if(value == 0)
{
close(pipe2[WRITE]);
read(pipe2[READ],&result,sizeof(result));
if(result == 0)
{
close(pipe2[READ]);
printf("Pipe2[Read] closed!\n");
wait(0);
}
}
else
{
read(pipe2[READ],&result,sizeof(result));
printf("Result: %d.\n",result);
}
}
break;
}
}
我一直在这几个小时了,我不明白为什么我的代码行事都疯了。当我进入1
它说:“管关闭,如果我进入0
它试图给人一种错误Cannot create pipes!
之前接受其他输入。
我想我失去了一些东西很基本的在这里。关于这个问题的任何帮助是非常赞赏。
你在哪里创建管?你'if'语句检查的内容管的值,但你永远不叫'管()'。 – Barmar
,应该管总是一个2元素的数组,为什么你有'int pipe1 [1]'? – Barmar
还...返回代码是你的朋友 - 使用它们。 – Duck