gpt4 book ai didi

使用 C 中的管道创建父子之间的双向通信

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

我正在尝试编写一个程序,允许进程与其子进程进行双向通信,即它可以向子进程发送消息,也可以从子进程接收消息。我第一次尝试创建 2 个管道并将管道的每一端链接到父级和子级标准输入和标准输出:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
int firstPipe[2];
int secondPipe[2];
if (pipe(firstPipe) < 0) {
perror("pipe");
exit(1);
}
if (pipe(secondPipe) < 0) {
perror("pipe");
exit(1);
}
if (fork() != 0) { // child
dup2(firstPipe[0], 0);
dup2(secondPipe[1], 1);
char input[70];
printf("Mr. Stark...");
fgets(input, 70, stdin);
fprintf(stderr, "%s I don't wanna go...\n", input);
} else { // parent
dup2(secondPipe[0], 0);
dup2(firstPipe[1], 1);
char message[70];
fgets(message, 70, stdin);
printf("%s I don't feel so good...", message);
}
return 0;
}

这个程序应该是从子进程向父进程发送消息,然后父进程向子进程发送回复,然后子进程打印最终结果(斯塔克先生……我感觉不太好) ...我不想去...)到stderr,但它不起作用:(当我尝试运行它时,它卡住了,好像其中一个进程(或两个进程)正在等待输入。是我的代码有问题吗?只要最终结果有效,我也愿意接受其他方法的建议。感谢您的帮助。

最佳答案

fgets 读取直到看到换行符(或缓冲区已满)。

parent 从

开始
fgets(message, 70, stdin);

等待排队。

子输出

printf("Mr. Stark...");

然后也等待:

fgets(input, 70, stdin);

“Mr. Stark...” 不包含换行符。事实上,它可能根本没有被发送,而是缓冲在 stdout 内部,但这可以在 printf 之后用 fflush(stdout) 来修复.

但即便如此,fgets 仍然会等待永远不会到来的换行符。

修复:

printf("Mr. Stark...\n");
fflush(stdout);

关于使用 C 中的管道创建父子之间的双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463615/

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