如何实现shell的管道功能,如 ls | wc | wc 这样的命令

rookit 2009-05-14 11:50:31
比如ls | wc可以通过以下代码实现
#include <unistd.h>

int fd[2];
void run_ls()
{
dup2(fd[1],1);
close(fd[0]);
close(fd[1]);
execve("/bin/ls",NULL,NULL);
}
void run_wc()
{
dup2(fd[0],0);
close(fd[0]);
close(fd[1]);
execve("/usr/bin/wc",NULL,NULL);
}
int main()
{
pipe(fd);
if(fork()==0)
run_ls();
else
run_wc();
return 0;
}

ls | wc | wc如何实现呢?
...全文
858 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sniperjzp 2011-10-25
  • 打赏
  • 举报
回复
学习了,谢谢~!
Ailen 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 morris88 的回复:]
貌似大致如下:

C/C++ code

#include <unistd.h>

int fd[2];

void run_ls()
{
close(fd[0]);
close(fd[1]);
execve("/bin/ls", NULL, NULL);
}

void run_wc()
{
close(fd[0]);
……
[/Quote]
这个显然不行呀,要是我不知道有几个管道怎么办?不可能有多少写多少吧。。。。。
xiuzhaoyang 2010-01-21
  • 打赏
  • 举报
回复
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
fgc_2001 2010-01-21
  • 打赏
  • 举报
回复
谢谢
rookit 2009-05-15
  • 打赏
  • 举报
回复
2楼这个应该不能看成一部分吧
毕竟每个命令都是在不同的进程中实行的,怎么看成一部分啊
rookit 2009-05-15
  • 打赏
  • 举报
回复
一楼的那个说明也是单个管道的实现啊
我想要的是多个管道
比如ls | wc | wc | wc 这样的
rookit 2009-05-15
  • 打赏
  • 举报
回复
恩,谢谢楼上
morris88 2009-05-15
  • 打赏
  • 举报
回复
貌似大致如下:

#include <unistd.h>

int fd[2];

void run_ls()
{
close(fd[0]);
close(fd[1]);
execve("/bin/ls", NULL, NULL);
}

void run_wc()
{
close(fd[0]);
close(fd[1]);
execve("/usr/bin/wc", NULL, NULL);
}

int main()
{
pipe(fd);

if (fork() > 0) {
dup2(fd[1], 1);
run_ls();
}
else {
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
pipe(fd);

if (fork() > 0) {
dup2(fd[1], 1);
run_wc();
}
else {
dup2(fd[0], 0);
run_wc();
}
}
return 0;
}
快乐田伯光 2009-05-14
  • 打赏
  • 举报
回复
不还是一样吗? 你把ls看成一部分,把wc | wc看成另一部分; wc | wc再分解一下不就行了吗?

就是算a + b与算a + b + c的区别
  • 打赏
  • 举报
回复

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧