【问题标题】:How to pipe stdin to a file using pipe and fork system calls如何使用管道和叉子系统调用将标准输入管道传输到文件
【发布时间】:2014-05-13 00:18:12
【问题描述】:

我正在尝试使用管道将标准输入通过管道传输到文件。
我的看法是,我需要将标准输入设为管道的写入端。
对于代码,这是我到目前为止所拥有的:

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] 读取时,那里什么都没有。
有什么我遗漏的吗?

【问题讨论】:

  • 旁白:更好的dup2(fd[#], 0), close(fd[0]),close(fd[1]) 除非你想打开 1 个重复的句柄。
  • 当然,你想要select(*fd + 1, &in, NULL, NULL, NULL); fd[0] 和 fd[1] 中的序数之间没有任何关系。
  • @Deduplicator,您在 select 调用中提出了一个很好的观点并阅读。对于 dup2 我在 dup2 调用之前关闭 fd[0] 并且 fd[1] 之后不会有效果。但我认为这是一种很好的做法。
  • 读写循环应该是:ssize_t n;while(0<(n=read(*fd, &buff, sizeof buff)) write(1, buff, n);
  • 另外,在你退出之前,在你的子进程的管道中加入一些东西。

标签: c fork pipe stdin


【解决方案1】:

dup2(fd[1], 0); 不会做你需要它做的事情。调用之后,当某些内容写入您的进程的 STDIN 时,它不会进入管道 fd[1]。它只是让文件描述符0 引用您进程中的管道。没有任何东西写入管道,因此没有什么可读取的。

【讨论】:

  • 是的,我刚刚意识到这一点。除了调用 write(fd[1], contents of STDIN) 之外,还有其他方法吗?
【解决方案2】:

只需在标准输入上使用 freopen()。这应该可以解决问题。

【讨论】:

  • 我的目标是使用管道传输数据,否则我会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2019-05-17
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多