c - 在 C 中处理管道

标签 c linux shell pipe

我正在尝试在 Linux 上用 C 语言实现一个 shell。我正在从事的这个项目要求用 C 创建一个 shell,从创建一个非常基本的(myShell)开始,逐步深入。首先,我必须用像

这样的简单命令创建一个 shell

ls,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/

相关文章:

bash - 如何重复启动和终止一个永无止境的 bash 进程

shell - SSH:向本地后台发送远程命令

c++ - 计算具有相同结果的给定对幂的不同项

c - 通过指针访问在内部作用域中声明的变量是否安全?

linux - 如何更改文件的所有权并在更改文件所有权后访问该文件?

linux - linux命令ps -ef有什么区别| grep [W]DA 和 ps -ef | grep WDA?

c++ - Amazon AWS CPP SDK 获取 S3 Bucket 下载进度

c++ - double 的有效小数位数?

c - 如何读取旋转编码器输入

bash:验证去皮成功