dup2有问题

时间:2010-09-04 13:22:15

标签: c linux dup2

将Ben Voigt的答案纳入代码之后,似乎可以正常工作

原始问题:

我正在尝试使用dup2:

  1. 将“ls -al”的输出作为输入传递给“grep foo”,
  2. 其输出变为“grep bar”的输入,
  3. 最终输出到stdout。
  4. 最终输出为(空白),文件“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);
    }
    

1 个答案:

答案 0 :(得分:1)

您的open调用会在“in”中创建一个空文件,并且没有任何程序写入该文件,因此这是预期的。由于grep的两个实例都从空文件中读取,因此它们的输出也是空的。

你真正想要的是使用pipe函数来获得一对句柄,它被写成一个程序并由下一个程序读取。您需要调用它两次,因为子进程之间有两组连接。