当前位置: 技术问答>linux和unix
如何实现shell的管道功能,如 ls | wc | wc 这样的命令
来源: 互联网 发布时间:2017-01-10
本文导语: 比如ls | wc可以通过以下代码实现 #include 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...
比如ls | wc可以通过以下代码实现
#include
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如何实现呢?
#include
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如何实现呢?
|
貌似大致如下:
#include
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;
}
|
|
不还是一样吗? 你把ls看成一部分,把wc | wc看成另一部分; wc | wc再分解一下不就行了吗?
就是算a + b与算a + b + c的区别
就是算a + b与算a + b + c的区别