理解C程序

时间:2015-04-20 14:53:39

标签: c

您好我有以下程序,我了解管道如何工作和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");

    }

}

2 个答案:

答案 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);
}
祝你好运! :)