将STDOUT重定向到文本文件无法正常工作

时间:2016-12-05 02:27:13

标签: c unix pipe fork

父进程在将stdout更改为W-pipeside后执行hello.exe(将“Hello!\ n”打印到stdout)。

子进程接受此(stdin已更改为R-pipeside)并将输出重定向到out.txt文件。我在这里遵循了指南和许多类似的问题,并没有看到代码有任何问题。

问题是out.txt文件已创建,但它是空的。什么都没写。

int main (void)
{
    pid_t child;
    int Pipe[2];

    (void) pipe(Pipe);

    child = fork();

    if (child == 0)
    {
        //Redirecting Child's STDIN to Pipe's read.
        (void) close(0);
        (void) dup(Pipe[0]);
        (void) close(Pipe[0]);
        (void) close(Pipe[1]);

        //Redirecting Child's STDOUT to out.txt file.
        int file = open("out.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
        (void) close(1);
        (void) dup(file);
        (void) close(file);
    }   
    else 
    { 
        //parent process
        (void) close(1);
        (void) dup(Pipe[1]);
        (void) close(Pipe[0]);
        (void) close(Pipe[1]);
        (void) execl("hello.exe", "hello.exe", (char*)NULL);
        perror("execl");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

  

您能否提供有关如何正确阅读和阅读的更多信息   写在子进程中?

如果我复制我的钥匙给你,那是否意味着门会在那时神奇地打开?当然不是。复制密钥后,您仍需要对其执行某些操作。同样在这里。复制文件描述符不会神奇地导致数据被读取或写入。您仍然需要调用写入或读取这些文件描述符的函数。在这种情况下,调用任何标准函数从stdin读取(例如scanffgets(.., stdin)等)并写入stdout(例如printfwrite(STDOUT_FILENO, ..),等等)。通过调用孩子中的那些功能来试一试。                      - kaylum