父子之间通过管道进行通信
communication between parent and child through pipe
我想要一个亲子对话的节目。
所以输出将是:
- p: 值
- c: 值
- p: 单词
- c: 单词
等等……
下面是一个代码示例,其中输出首先与父对话,然后是子对话。
我怎样才能更正代码?
for(int i=0; i<N; i++){
pid=fork();
if(pid==-1){
perror("fork\n");
exit(EXIT_FAILURE);
}
else if(pid==0){
srand(time(NULL));
int c;
read(fd[i][0], &c, 1);
printf("c: value: %d\n", c);
char word[c];
read(fd[i][0],&word, sizeof(word));
printf("c: word: %s\n", word);
int sum;
sum=c*i;
write(fd[i][1], &sum, sizeof(int));
printf("c: sended %d\n", sum);
int flag=0;
printf("flag :%d\n", flag);
read(fd[i][0], &flag, sizeof(int));
printf("c: flag= %d ->exit\n", flag);
exit(1);
}else{
int c;
c=rand()%100+1;
write(fd[i][1], &c, sizeof(int));
printf("p: value: %d\n", c);
char word[c];
write(fd[i][1], &word, sizeof(word));
printf("p: word: %s\n", word);
int sum;
read(fd[i][0], &sum, sizeof(int));
printf("p: sum is: %d\n", sum);
int flag=1;
write(fd[i][1], &flag, sizeof(int));
printf("par: flag exit %d\n", flag);
wait(NULL);
}
}
要在两个进程之间进行双工通信,您需要两个个管道:
- 一个用于parent到child的通信;
- 还有一个用于child到parent的通信
如果你对两者使用相同的管道,那么你可能会遇到类似 child 的情况,向管道写入一些东西,然后直接再次读回(并且 parent 将永远看不到数据)。
例如,这可能发生在
write(fd[i][1], &sum, sizeof(int));
// ...
// Could read sum that was written just above in the same process
read(fd[i][0], &flag, sizeof(int));
在您的 child 过程中。
对于上面显示的 write
和 read
调用的示例,您可以使用如下内容:
int parent_to_child[2]; // Pipe where parent process write and child reads
int child_to_parent[2]; // Pipe where parent process reads and child writes
pipe(parent_to_child);
pipe(child_to_parent);
// ...
pid = fork();
if (pid == 0)
{
// Other code...
// Child writes to parent
write(child_to_parent[1], &sum, sizeof(int));
// Child reads from parent
read(parent_to_child[0], &flag, sizeof(int));
// ...
}
else
{
// Other code...
// Parent reads from child
read(child_to_parent[0], &sum, sizeof(int));
// Parent writes to child
write(parent_to_child[1], &flag, sizeof(int));
// ...
}
我想要一个亲子对话的节目。 所以输出将是:
- p: 值
- c: 值
- p: 单词
- c: 单词
等等……
下面是一个代码示例,其中输出首先与父对话,然后是子对话。 我怎样才能更正代码?
for(int i=0; i<N; i++){
pid=fork();
if(pid==-1){
perror("fork\n");
exit(EXIT_FAILURE);
}
else if(pid==0){
srand(time(NULL));
int c;
read(fd[i][0], &c, 1);
printf("c: value: %d\n", c);
char word[c];
read(fd[i][0],&word, sizeof(word));
printf("c: word: %s\n", word);
int sum;
sum=c*i;
write(fd[i][1], &sum, sizeof(int));
printf("c: sended %d\n", sum);
int flag=0;
printf("flag :%d\n", flag);
read(fd[i][0], &flag, sizeof(int));
printf("c: flag= %d ->exit\n", flag);
exit(1);
}else{
int c;
c=rand()%100+1;
write(fd[i][1], &c, sizeof(int));
printf("p: value: %d\n", c);
char word[c];
write(fd[i][1], &word, sizeof(word));
printf("p: word: %s\n", word);
int sum;
read(fd[i][0], &sum, sizeof(int));
printf("p: sum is: %d\n", sum);
int flag=1;
write(fd[i][1], &flag, sizeof(int));
printf("par: flag exit %d\n", flag);
wait(NULL);
}
}
要在两个进程之间进行双工通信,您需要两个个管道:
- 一个用于parent到child的通信;
- 还有一个用于child到parent的通信
如果你对两者使用相同的管道,那么你可能会遇到类似 child 的情况,向管道写入一些东西,然后直接再次读回(并且 parent 将永远看不到数据)。
例如,这可能发生在
write(fd[i][1], &sum, sizeof(int));
// ...
// Could read sum that was written just above in the same process
read(fd[i][0], &flag, sizeof(int));
在您的 child 过程中。
对于上面显示的 write
和 read
调用的示例,您可以使用如下内容:
int parent_to_child[2]; // Pipe where parent process write and child reads
int child_to_parent[2]; // Pipe where parent process reads and child writes
pipe(parent_to_child);
pipe(child_to_parent);
// ...
pid = fork();
if (pid == 0)
{
// Other code...
// Child writes to parent
write(child_to_parent[1], &sum, sizeof(int));
// Child reads from parent
read(parent_to_child[0], &flag, sizeof(int));
// ...
}
else
{
// Other code...
// Parent reads from child
read(child_to_parent[0], &sum, sizeof(int));
// Parent writes to child
write(parent_to_child[1], &flag, sizeof(int));
// ...
}