【发布时间】:2014-09-08 22:09:17
【问题描述】:
我正在编写自己的 shell。下面是其中的一部分。我想用两个子进程实现管道。 但是当我执行下面的代码时,有些命令有效,有些则无效。 '谁 |排序', 'ls |排序'工作但'会|排序', '猫文件 |排序'让我的外壳停止。我必须'cntrl + c'才能逃离我的外壳。我不明白为什么有些命令有效而有些则无效。请有人指出我错过了什么?
int pipefd[2];
int pipePos = checkPipePos(argc, argv); //find '|' command position in argv
if (pipe(pipefd) == -1) {
printf("Creating pipe failed\n");
return;
}
if (fork() == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
execlp(argv[0], argv[0], NULL);
}
if (fork() == 0) {
close(pipefd[1]);
dup2(pipefd[0], 0);
execlp(argv[pipePos + 1], argv[pipePos + 1], NULL);
}
close(pipefd[0]);
close(pipefd[1]);
while (wait(NULL) >= 0);
【问题讨论】:
-
ll是否别名为ls -al? -
是的,没错。在这种情况下它会影响吗??..'ls |排序'也有效,,
-
我想你可能用错了
execlp。第一个参数不应该是路径吗? support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execlp.htm -
我认为如果我将 arg 放在第一个参数位置,bash 会自动找到路径。我错了吗?如果是,我该如何解决?
-
Bash 在你的程序中不能做任何事情。一旦它开始执行你的程序,你就不再使用 bash,而是使用你的 shell。