【发布时间】:2010-09-04 13:22:15
【问题描述】:
将 Ben Voigt 的答案合并到代码中后,它似乎可以工作
原问题:
我正在尝试使用 dup2 来:
- 将“ls -al”的输出作为输入传递给“grep foo”,
- 其输出成为“grep bar”的输入,
- 最终输出到标准输出。
最终输出为(空白),文件“in”为(空白),文件“out”的输出为“ls -al”。
任何想法可能会发生什么?
int main()
{
pid_t pid;
int i;
int inFileDes,outFileDes;
inFileDes=open("in",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
outFileDes=open("out",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
for(i=0;i<3;i++)
{
if((pid=fork())==0)
{
switch(i)
{
case 0:
dup2(outFileDes,1);
execl("/bin/ls","ls","-al",0);
break;
case 1:
// originally:
dup2(outFileDes,0); // dup2(outFileDes,1);
dup2(inFileDes,1); // dup2(inFileDes,0);
execl("/bin/grep","grep","foo",0); //lines having foo
break;
case 2:
dup2(inFileDes,0);
execl("/bin/grep","grep","bar",0); //lines having foo & bar
break;
}
exit(-1); //in error
}
waitpid(pid,NULL,0);
}
close(inFileDes);
close(outFileDes);
return(0);
}
【问题讨论】:
-
editing..interchanged inFileDes & outFileDes in case 1
-
没有理由为
pid使用数组,因为循环迭代后再也不会使用pid[i]。 -
@Ben Voigt,将 pid[] 更改为 pid