gpt4 book ai didi

c - linux C从子级向父级发送数据没问题,但无法从子级向父级发送数据

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

我想 fork 一个 child 并将管道连接到 child 的标准输入和标准输出。然后运行exec ./xx。之后,我将 17 从 parent 发送给 child ,然后 child 将其打印出来。到目前为止一切都很好。但是当我向 parent 发送 17 返回时,它不起作用。结果是:什么也不输出,看起来像是在等待一些输入。如果我删除父级中的代码“fscanf(b, "%d", &x); ”,则输出为:从 C 0 从第 17 页我很困惑为什么我会得到奇怪的结果?谢谢

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

int main(int argc, char** argv) {
int fds[2], cp[2], x = 0;
pipe(fds);
pipe(cp);
int pid=fork();

// c
if (pid==0) {
close(fds[1]);
close(cp[0]);
dup2(fds[0],0);
dup2(cp[1], 1);
close(cp[1]);
close(fds[0]);
execlp("./xx", "xx", 0);
}
// p
if (pid) {

close(fds[0]);
close(cp[1]);
dup2(fds[1],1);
close(fds[1]);
FILE* a=fdopen(1, "w");
FILE* b=fdopen(cp[0], "r");
fprintf(a, "17");
fscanf(b, "%d", &x);
fprintf(stderr, "from C %d", x);
}

return 0;
}

XX

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
int main() {
int y = 0;
FILE* r=fdopen(STDIN_FILENO, "r");
fscanf(r, "%d", &y);
fprintf(stderr, "from p %d \n ", y);
FILE* w=fdopen(STDOUT_FILENO, "w");
fprintf(w, "17");
return 0;
}

最佳答案

我想我已经明白了。您需要刷新输出缓冲区。默认情况下,fprintf 仅对 stderr 执行此操作。所以在parent.c文件中:

fprintf(a, "17");
fflush(a);

在 child 身上:

fprintf(w, "17");
fflush(w);

我本以为它可以单独工作,但我不是 C 专家,而且事实并非如此。但是,将父级中的两行更改为

fprintf(a, "17\n");
fflush(a);

让它对我有用。

关于c - linux C从子级向父级发送数据没问题,但无法从子级向父级发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32648483/

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