在C中实现多个管道和命令执行

时间:2016-11-05 16:06:31

标签: c linux unix pipe

我有一个功课,要求我创建一个shell,执行由管道分隔的多个命令。这是我的代码片段,用于分叉子节点并执行命令:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs

尽管在简单的例子中似乎工作得很好,但在一些更复杂的情况下,评分系统给了我提示:你应该等待管道链中的所有进程在显示提示之前终止,不只是为了最后一个!

你能说出我的错误吗?

1 个答案:

答案 0 :(得分:1)

好吧,我的错误是我只等待最后一个分叉的孩子终止。

以下是等待每个子项终止的正确代码段:

    for (int i = 0; i < commands; i++) {

        place = commandStarts[i];

        if((pid = fork()) < 0) exit(1);
        else if (pid == 0) {
            if(i < pipe_counter && dup2(fds[j + 1], 1) < 0) exit(1);// If this is not the last remaining command

            if(j != 0 && dup2(fds[j-2], 0) < 0) exit(1);            // If this is not the first command

            for(int c = 0; c < 2*pipe_counter; c++) close(fds[c]);

            if(execvp(argv[place], argv+place)) exit(1);            // Execute and if it returns anything, exit!
        }
        j+=2;
    }

    for(int i = 0; i < 2 * pipe_counter; i++) close(fds[i]);

    for(int i = 0; i < commands; i++) wait(&status);            // The only program that gets to this point is the 
                                                                //     parent process, which should wait for completion.

还要感谢wallyk帮助我思考这个问题!