微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C中编码多个管道

我正在尝试在C中为我的 shell实现多个管道.

我只有一个管道功能管道| b但不是| b | C.

int   c[2];
int   returnv;
pid_t id;

pipe(c);
pid = fork()) == 0
if (pid)
{
  dup2(c[1],0);
  close(p[1]);
  close(p[1]);
  execvp(array(0),array);
}

if ((pid = fork()) == 0)
{
  dup2(p[0],1);
  close(p(0));
  close(p[0]);
  returnv = execvp(array[0],array);
}

close(p[1]);
wait(NULL);
wait(NULL);
wait(NULL);
return returnv;

这是第二个版本:

int i = 0;

while (i < x)

{
 pipe(c);
 if ((pid = fork()) == 0)
 {
   dup2(t[i],1);
   if (i < 2)
       dup2(p[0],1);
   close(p[1]);
 r=  execvp(cmd[i][0],cmd[i]);
 }
     wait(NULL);
     close(p[0]);
     i += 1;
     t[i] = p[1];

我怎样才能添加一些能使这段代码管理多个管道的东西呢?
非常感谢提前!

解决方法

编辑:根据您的评论

要执行多重管道,您需要将所有命令存储在某处.
这就是我使用结构选项卡的原因.

检查这个新版本可能更容易理解

首先,您需要一个选项卡或其他东西来存储所有命令:

int main()
{
  char *ls[] = {"ls",NULL};
  char *grep[] = {"grep","pipe",NULL};
  char *wc[] = {"wc",NULL};
  char **cmd[] = {ls,grep,wc,NULL};

  loop_pipe(cmd);
  return (0);
}

然后是将运行选项卡并启动所有内容函数

void    loop_pipe(char ***cmd) 
{
  int   p[2];
  pid_t pid;
  int   fd_in = 0;

  while (*cmd != NULL)
    {
      pipe(p);
      if ((pid = fork()) == -1)
        {
          exit(EXIT_FAILURE);
        }
      else if (pid == 0)
        {
          dup2(fd_in,0); //change the input according to the old one 
          if (*(cmd + 1) != NULL)
            dup2(p[1],1);
          close(p[0]);
          execvp((*cmd)[0],*cmd);
          exit(EXIT_FAILURE);
        }
      else
        {
          wait(NULL);
          close(p[1]);
          fd_in = p[0]; //save the input for the next command
          cmd++;
        }
    }
}

原文地址:https://www.jb51.cc/c/111238.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐