【发布时间】: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); -
另外,在你退出之前,在你的子进程的管道中加入一些东西。