我正在尝试在 Linux 上用 C 语言实现一个 shell。我正在从事的这个项目要求用 C 创建一个 shell,从创建一个非常基本的(myShell)开始,逐步深入。首先,我必须用像
这样的简单命令创建一个 shellls,pwd,echo,date,time
(shell1).
在那之后,我的 Shell 必须得到改进,以便它可以从文件(例如 txt 的)(shell2) 中进行排序,并且随着它的继续,我必须通过开发它来做更多的事情,并让它执行像
sort -r,sort -u.(shell3).
在第 3 个 shell 之前,我一直在使用重定向并且一切顺利。
现在对于第 4 个 shell,我应该让它使用管道运行命令,例如ls -l/家/|排序 > out.txt。我已经设法使命令工作,成功创建了 out.txt 文件并进行了相应的排序。在我的代码中有一个 while() ,所以在我给 shell 的每个命令之后,它都会要求下一个等等。但是当给出上面的示例命令并使用管道时,程序停止。终端不显示“myShell4>”,而是显示 Desktop$,它基本上退出了 shell。给它简单的命令,如“ls -l”,不使用管道,效果很好,所以我意识到问题出在管道上,它们阻止了我的程序循环。
我的代码中发生这种情况的部分:
//CHILD
dup2(pipefd[1],1);
close(pipefd[0]);
execute(cmd,path,argm);
//PARENT
dup2(pipefd[0],0);
close(pipefd[1]);
execlp(cmd2,cmd2,NULL);
有什么想法吗?提前致谢!
最佳答案
父级是 shell ,对吗?不要在那里执行;为管道的两端创建 child 并在 parent 中等待他们。如果这样做,shell 将被替换并且在命令结束后不再运行。
下面是两个命令之间管道的一些伪代码:
int pipefd[2];
pipe (pipefd);
// child for first command
if (fork () == 0) {
// setup in redirection if any
...
// setup out redirection
close (pipefd[0]);
dup2 (pipefd[1], STDOUT_FILENO);
...
exec (cmd1, ...);
exit (1);
}
// child for second command
if (fork () == 0) {
// setup in redirection
close (pipefd[1]);
dup2 (pipefd[0], STDIN_FILENO);
// setup out redirection if any
dup2 (output_file_fd, STDOUT_FILENO);
exec (cmd2, ...);
exit (1);
}
close (pipefd[0]);
close (pipefd[1]);
// parent waits and then restarts the loop
wait (NULL);
wait (NULL);
对于由管道连接的两个以上命令的列表,事情会变得更加复杂。
关于c - 在 C 中处理管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020267/