我们正在尝试通过命名管道在两个进程之间进行通信,这些管道被重定向到子进程中的stdin和stdout。父进程打开命名管道并在其上调用fdopen。我们看到的问题是fwrite在这上工作,但是甚至从重定向的stdout管道块中永久地读取一个字节。 使用文件描述符而不是FILE *时,代码可以正常工作。怎么了?代码有点长,抱歉。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
int create_fifo()
{
int file1;
unlink("fifo-0.0");
file1 = mkfifo("fifo-0.0",0666);
if(file1<0) {
printf("Unable to create a fifo");
return 0;
}
unlink("fifo-0.1");
file1 = mkfifo("fifo-0.1",0666);
if(file1<0) {
printf("Unable to create a fifo");
return 0;
}
return 1;
}
int main()
{
int fd, fd0, fd1;
pid_t pid;
char read_buf_p[50],write_buf_p[50];
char * args[3];
FILE *fd_stdin_p, *fd_stdout_p;
create_fifo();
args[0] = "/bin/cat";
args[1] = "-n";
args[2] = NULL;
pid = fork();
if(pid == 0)
{
fd = open("fifo-0.0", O_RDONLY);
dup2(fd, 0);
close(fd);
fd = open("fifo-0.1", O_WRONLY);
dup2(fd, 1);
close(fd);
execv(args[0],args);
}
else
{
fd0 = open("fifo-0.0", O_WRONLY);
fd_stdin_p = fdopen(fd0,"w");
fd1 = open("fifo-0.1", O_RDONLY);
fd_stdout_p = fdopen(fd1,"r");
int sz = fwrite("Hello World", sizeof(char), strlen("Hello World"), fd_stdin_p);
fread(read_buf_p,1,1,fd_stdout_p);
printf("%s\n", read_buf_p);
}
return 0;
}
答案 0 :(得分:1)
我认为这是因为标准输出的缓冲。 只需在fflush()
结束时使用'\ n'答案 1 :(得分:0)
这是基于FILE
的I / O默认为“行缓冲”的结果。这意味着它会读取和写入整行,并且由于您的数据不是整行,因此它会滞留在缓冲区中而不会传递给基础文件描述符。
尝试在输出数据末尾添加\n
,或致电fflush()
。