我想将子进程的输出通过管道传输到父进程的stdout
. 我知道还有其他方法可以做到这一点,但为什么不能将管道的读取端复制到stdout
?为什么程序不打印写到管道写端的内容?
在这里,我有一个关于我正在尝试做的事情的最小示例(没有任何子流程)。我希望test
在运行时看到输出,但程序什么都不输出。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int fds[2];
if(pipe(fds) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
if(write(fds[1], "test", 5) == -1) {
perror("write");
exit(EXIT_FAILURE);
}
if(dup2(fds[0], STDOUT_FILENO) == -1) {
perror("dup2");
exit(EXIT_FAILURE);
}
return 0;
}
管道是共享缓冲区和一些锁定或控制语义的两个“文件”。当您写入管道时,数据被放入缓冲区。当您从管道中读取数据时,数据是从缓冲区中获取的。
管道中没有任何东西可以将数据移动到某个输出设备。
如果您使用dup2
将管道的读取端复制到标准输出文件描述符(编号 1)中,那么您所拥有的只是文件描述符 1 上管道的读取端。这意味着您可以向文件描述符 1 发出读取操作,并且系统将从管道中提供您的程序数据。
在这方面,文件描述符 1 没有什么“特别的”。将任何文件放在文件描述符 1 上不会导致该文件自动发送到任何地方。标准输出的正常工作方式是打开终端或某些选定的输出文件或文件描述符 1 上的其他设备,然后通过写入文件描述符 1 将内容发送到该设备或文件。操作系统不会自动写入内容到文件描述符 1;你必须发出写操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句