【发布时间】:2019-12-22 15:01:03
【问题描述】:
我正在尝试了解管道在 Linux 中的工作原理。我编写了以下程序,编译它然后在终端中运行它。程序正常退出,没有错误,但没有打印出任何消息。有什么不对的吗?
PS:这段代码sn-p来自MIT的xv6操作系统课程。
#include <stdio.h>
#include <unistd.h>
int main() {
int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if (fork() == 0) {
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
execvp("/bin/wc", argv);
} else {
write(p[1], "hello world\n", 12);
close(p[0]);
close(p[1]);
}
}
【问题讨论】:
-
您可能应该检查返回值,例如来自
execvp。在我的 Ubuntu 机器上command -v wc返回/usr/bin/wc。另见How to check if a program exists from a Bash script? -
@jww 谢谢!我的系统在
usr/bin/wc中也有“wc”。 -
@jww,
exec*()函数不会返回任何内容,除非函数失败。所以如果它返回应该总是调用perror()然后exit( EXIT_FAILURE ); -
当
fork()失败时,发布的代码无法检查。在这种情况下,应该先调用perror(),然后再调用exit( EXIT_FAILURE ); -
@user3629249- 请参阅
execvp (3)man page。我在猜测(这只是一个猜测),execvp失败,errno是ENOENT。
标签: c linux operating-system