gpt4 book ai didi

c - 使用管道在父级和子级之间进行通信

转载 作者:行者123 更新时间:2023-11-30 14:33:22 26 4
gpt4 key购买 nike

为了更好地理解管道在 C 中的工作原理,我决定创建一个简单的程序。它应该执行以下操作:首先,我 fork 该程序。然后,父级从标准输入中读取并将所有内容写入管道,直到到达 EOF。然后子进程从该管道中读取内容并将内容写回到另一个管道中,然后该管道应该由父进程读取并写入标准输出。

是的,该程序不是很“有用”,但我只是想熟悉管道以及如何使用它们。这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char **argv) {
char buf;
int pipe_one[2];
int pipe_two[2];
pid_t child;

if(pipe(pipe_one) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

if(pipe(pipe_two) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

child = fork();
switch (child) {
case -1:
fprintf(stderr, "Error while forking.\n");
break;
case 0:
// child
// close unnecessary ends
close(pipe_one[1]);
close(pipe_two[0]);

// read input from parent and write it into pipe
while(read(pipe_one[0], &buf, 1) > 0) {
write(pipe_two[1], &buf, 1);
}
write(pipe_two[1], "\n", 1);
close(pipe_one[0]);
close(pipe_two[1]);
break;
default:
// parent
// close unnecessary ends
close(pipe_one[0]);
close(pipe_two[1]);

// read from standard input and write it into pipe
while(read(STDIN_FILENO, &buf, 1) > 0) {
write(pipe_one[1], &buf, 1);
}
write(pipe_one[1], "\n", 1);
close(pipe_one[1]);

// wait for child process to finish
wait(NULL);

// read from pipe that child wrote into
while(read(pipe_two[0], &buf, 1) > 0) {
write(STDOUT_FILENO, &buf, 1);
}
write(STDOUT_FILENO, "\n", 1);
close(pipe_two[0]);
break;
}

exit(EXIT_SUCCESS);
}

预期行为:一开始,程序读取用户输入,直到到达 EOF,然后再次将所有内容输出到标准输出中。

实际行为:程序读取整个输入,但一旦到达 EOF,它就会终止(成功),而不将任何内容写入标准输出。我究竟做错了什么?如果有人可以查看并帮助我,我会很高兴。

最佳答案

你为你的 child 关闭了 parent 的管道。

while(read(pipe_one[0], &buf, 1) > 0) {
write(pipe_two[1], &buf, 1);
}
write(pipe_two[1], "\n", 1);
close(pipe_one[0]); // Here you close pipes
close(pipe_two[1]); // for your parent

所以父级无法收到任何东西。只要删除这两行就可以了。

关于c - 使用管道在父级和子级之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59360940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com