您好我有以下程序,我了解管道如何工作和fork()等。但我有一个问题。为什么这个程序不打印“baz \ n” 结果是: 酒吧 foo
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
int fd[2];
char buf[32];
pipe(fd);
if(fork()==0){
dup2(fd[1],1);
printf("foo");
}
else{
read(fd[0],buf,31);
execl("/bin/echo","/bin/echo","bar",buf,0);
printf("baz\n");
}
}
答案 0 :(得分:1)
Execl不会返回原始程序。它用一个新进程替换当前进程(旧进程不会继续运行)。它将执行execl("/bin/echo","/bin/echo","bar",buf,0);
并且永远不会回来执行printf
。这就是为什么你只得到"bar foo"
的结果。
如果你看一下手册页:
http://linux.die.net/man/3/execl
查看描述中的第一段。
答案 1 :(得分:1)
你的节目没有写&#34; baz&#34;因为它首先运行你的 execl 函数,它关闭你创建的fork进程。换句话说,你必须把你的printf 放在 exec函数之前:
else{
read(fd[0],buf,31);
printf("baz\n");
execl("/bin/echo","/bin/echo","bar",buf,0);
}
祝你好运! :)