如何使用管道和fork系统调用将stdin管道传输到文件

时间:2014-04-02 00:04:04

标签: c fork pipe stdin

我正在尝试使用管道将标准输入管道传输到文件中 我看到它的方式是,我需要让stdin成为管道的写入端 对于代码,这是我到目前为止:

int main(int argc, char** argv) {

    int fd[2];
    pipe(fd);
    fd_set in;
    FD_ZERO(&in);
    FD_SET(fd[0], &in);
    if(fork() == 0){
        close(fd[0]);
        dup2(fd[1], 0);
        return 1;
    }
    else{
        close(fd[1]);
        select(fd[1] + 1, &in, NULL, NULL, NULL);
        if(FD_ISSET(fd[0], &in)){
            char buff[1024];
            while(read(fd[0], &buff, sizeof(buff)) != 0){
                write(1, buff, strlen(buff));
            }
        }

    }
}  

select语句会触发,但是当我从fd [0]读取时,那里什么也没有 有什么东西我不见了吗?

2 个答案:

答案 0 :(得分:0)

在stdin上使用freopen()。这应该可以解决问题。

答案 1 :(得分:0)

dup2(fd[1], 0);没有做你需要它做的事情。通话结束后,当某些内容写入您的流程的STDIN时,它不会进入管道fd[1]。它只是使文件描述符0引用进程中的管道 。什么都没有写入管道,所以没有什么可读的。