两个重定向程序

时间:2013-12-29 15:15:29

标签: c linux fork pipe

我尝试在C中编写一个命令解释器。我必须创建dwo和三个重定向(例如ls | grep ^d | wc -lls -ps | grep / | pr -3 | more

我有代码来操作一个重定向

    if(k==1)
{
  int pfds[2];
  pipe(pfds);
  child_pid = fork();
  if(child_pid==0)
  {       
    close(1);       
        dup(pfds[1]);   
        close(pfds[0]); 
        execlp(arg1[0], *arg1, NULL);
  }
  else 
  {
        close(0);      
        dup(pfds[0]);
        close(pfds[1]); 
        execlp(arg2[0], *arg2, NULL);
  }     
}

我的问题是如何使用pipefork进行两次和三次重定向?

我尝试只使用一个管道,但这不起作用。

1 个答案:

答案 0 :(得分:1)

您必须创建与“转移”一样多的pipe个变量。 然后创建一个命令列表。

如果您希望父进程离开,您将为每个命令分叉一个进程。否则少一点。

表示第一个命令,dup或'dup2`仅适用于STDOUT。

和最后一个命令dup或'dup2`仅适用于STDIN。

其余部分,dup或'dup2`表示STDIN和STDOUT。

你可以用2到2的for循环来做到这一点。

例如: shell $&gt; cat file.txt | grep'pattern1 | pattern2'| grep'pattern1'| wc -l <​​/ p>

我假设您没有使用exec的父进程 因此,您将创建一个列表/数组/命令向量。 list将拥有所有4个命令。 为父进程本身的每个命令创建4个管道。

运行一个循环4次迭代,每个循环用于命令。

  • 分叉一个过程。
  • 如果是父进程,请继续。
  • 否则(子)
    • dup / dup2仅用于第一个命令(cat)的STDOUT。
    • dup / dup2仅STDIN用于最后一个命令(wc -l)。
    • dup / dup2否则都是STDIN和STDOUT。
    • 然后运行exec

CHEERS:)