gpt4 book ai didi

c - 2路管道通讯。悬挂

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

我试图使用 2 个文件描述符让父级向子级发送信息,并让子级将其发回。

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

#define READ 0
#define WRITE 1
int main(void) {

int fdWrite[2];
int fdRead[2];
int pid, i, num;
FILE* output;

if (pipe(fdRead) == -1) {
perror("Can't create pipe");
exit(1);
}

if (pipe(fdWrite) == -1) {
perror("Can't create pipe");
exit(1);
}

char mystring[100] = { 0 };

char c;

pid = fork();
if (pid) {
FILE * read;
FILE * write;
close(fdRead[WRITE]);
close(fdWrite[READ]);

write = fdopen(fdWrite[WRITE], "w");
fprintf(write, "parent %s\n", "jeronimooo...");

read = fdopen(fdRead[READ], "r");
fgets(mystring, 100, read);
fprintf(stdout, "%s\n", mystring);

} else {
/* child */
dup2(fdRead[WRITE], STDOUT_FILENO);
close(fdRead[READ]);
close(fdRead[WRITE]);

dup2(fdWrite[READ], STDIN_FILENO);
close(fdWrite[READ]);
close(fdWrite[WRITE]);

fgets(mystring, 100, stdin);
fprintf(stdout, "child %s\n", mystring);

}
exit(0);
}

我想做的事:

  1. 写入父级中的文件描述符,由其接收描述符读取。
  2. 然后在另一个描述符中,将信息从子级发送到父级中的接收描述符。

当前挂起:fgets(mystring,100, read)

最佳答案

C I/O 流通常缓冲,这意味着当您执行以下操作时: fprintf 那么您打印到流的内容实际上并没有写入文件,而是写入内存缓冲区。当缓冲区已满时,其中的数据实际上会写入文件。 fflush函数刷新缓冲区,即它获取缓冲区中的内容并将其立即写入文件。

这里的问题是,当您执行fdopen时,文件流是通过完全缓冲创建的(与例如stdout的行缓冲不同),因此缓冲区确实必须被填满才能真正被写下来。通过显式强制写入,管道的另一端可以读取它。

关于c - 2路管道通讯。悬挂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25867072/

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