使用命名管道在重定向的标准输出上永久阻止

时间:2013-06-28 10:12:30

标签: c linux

我们正在尝试通过命名管道在两个进程之间进行通信,这些管道被重定向到子进程中的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;
}

2 个答案:

答案 0 :(得分:1)

我认为这是因为标准输出的缓冲。 只需在fflush()

结束时使用'\ n'

答案 1 :(得分:0)

这是基于FILE的I / O默认为“行缓冲”的结果。这意味着它会读取和写入整行,并且由于您的数据不是整行,因此它会滞留在缓冲区中而不会传递给基础文件描述符。

尝试在输出数据末尾添加\n,或致电fflush()