【发布时间】:2016-03-17 00:48:39
【问题描述】:
// Some code for initialization
int fd[2];
pipe(fd);
int k = fork();
if (k == 0) { // Child
dup2(fd[1], fileno(stdout));
execl("someExecutable", NULL); // The executable just printfs one line
}
else if (k > 0) { // Parent
wait(&status);
while (read(fd[0], buffer, 1) > 0) {
printf("%s", buffer);
}
}
我省略了错误检查。
首先,如果我的可执行文件有printf("some line\n");,我在屏幕上的输出看起来像s?9o?9m?9e?9 ?9l?9i?9n?9e?9。为什么中间会有这些随机字符?
第二,我的阅读永无止境。当可执行文件结束时,管道的读取端应该已经关闭了吗?
谢谢。
【问题讨论】:
-
您确定
buffer将是一个以空字符结尾的字符串吗? -
我们来看管道初始化代码。
-
这是让我困惑的一件事。它是否为空终止。 o 不是直接在管道缓冲区中的 s 之后出现吗?垃圾值如何插入到两者之间?
-
我希望,我在这里没有遗漏任何东西。excel() 接受代表新可执行映像的参数,而不是函数调用,例如 excel("/usr/bin/ls", '- al", NULL); 执行 ls 命令以长模式打印所有文件属性。有关详细信息,请参阅linux.die.net/man/2/execve。
-
这是您的 while 循环不退出的原因。 所有管道的写端必须关闭。这意味着父级必须在开始循环之前关闭 fd[1],否则从 fd[0] 读取将无限期阻塞。
标签: c pipe system-calls