我有一个功课,要求我创建一个shell,执行由管道分隔的多个命令。这是我的代码片段,用于分叉子节点并执行命令:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs
尽管在简单的例子中似乎工作得很好,但在一些更复杂的情况下,评分系统给了我提示:你应该等待管道链中的所有进程在显示提示之前终止,不只是为了最后一个!
你能说出我的错误吗?
答案 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帮助我思考这个问题!