7

Cでシェルに複数のパイプを実装しようとしています.

私が持っているのは、 | をパイプするパイプ関数だけです。| 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;

これは 2 番目のバージョンです。

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];

このコードに複数のパイプを管理させる小さなものを追加するにはどうすればよいですか? よろしくお願いします!

4

2 に答える 2

14

編集:あなたのコメントによると

複数のパイプを実行するには、すべてのコマンドをどこかに保存する必要があります。そのため、構造のタブを使用しました。

この新しいバージョンを確認すると、理解しやすいかもしれません

最初に、すべてのコマンドを保存するためのタブまたは何かが必要です。

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++;
        }
    }
}
于 2013-07-13T15:30:32.763 に答える
0

2 パイプ モデルの作業バージョンと 3 パイプ モデルのヒントを示します。試してみて、それが機能するかどうかを確認してください。注: 適切なヘッダー ファイルをインクルードしないと、dup2() が悪夢になります。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int   p[2];
int pid;
int r;

main()
{
    char *ls_args[] = {"ls", NULL};
    char *grep_args[] = {"grep", "pipe", NULL};

    pipe(p);

    pid = fork();
    if (pid  != 0) {
            // Parent: Output is to child via pipe[1]

            // Change stdout to pipe[1]
            dup2(p[1], 1);
            close(p[0]);

            r = execvp("ls", ls_args);
    } else {
            // Child: Input is from pipe[0] and output is via stdout.
            dup2(p[0], 0);
            close(p[1]);

            r = execvp("grep", grep_args);
            close(p[0]);
    }

    return r;
}

a|b|c の場合、ヒントは 2 つのパイプ、つまり p1[2] と p2[2] を使用することです。これを試して、その仕組みをお知らせください。

于 2013-07-13T15:30:48.737 に答える