C build pipe для команды 'ls -lR [-ddir] | сортировать | grep string [> outfile] ' - PullRequest
0 голосов
/ 19 июня 2019

Для домашней работы мне нужно создать программу на C, которая эквивалентна команде оболочки 'ls -lR [dir] |сортировать |grep string [> outfile] 'с синтаксисом' lsgrep [-ddir] string [-foutfile] '.

По какой-то причине второй канал (который должен быть подключен к grep-child-process) не'Кажется, не работает должным образом.

Когда я удаляю третий дочерний процесс (grep), программа печатает отсортированное содержимое 'ls -lR' и завершает работу.Поэтому я думаю, что проблема связана со вторым каналом (sortgrep).

    ...
    // ls -lR [dir] | sort | grep string [ >outfile]
    // -------------^------^------------------------
    int lssort[2];
    int sortgrep[2];

    pipe(lssort);
    pipe(sortgrep);

    if (fork() == 0)
    {
      close(STDOUT_FILENO);
      dup(lssort[1]);
      close(lssort[0]);
      char * argv[] =
      { "ls", "-lR", parameters.dirIsSet ? dir : (char *) NULL, (char *) NULL };
      execvp("ls", argv);
    }

    if (fork() == 0)
    {
      close(STDIN_FILENO);
      dup(lssort[0]);
      close(lssort[1]);

      close(STDOUT_FILENO);
      dup(sortgrep[1]);
      close(sortgrep[0]);

      char * argv[] = { "sort", (char *) NULL };
      execvp("sort", argv);
    }

    if (fork() == 0)
    {
      close(STDIN_FILENO);
      dup(sortgrep[0]);
      close(sortgrep[1]);

      if (parameters.outfileIsSet)
      {
        close(STDOUT_FILENO);
        int fd = open(outfile, O_CREAT | O_RDWR);
        if (fd == -1) perror("Error: Could not open file");
        dup(fd);
        close(fd);
      }

      char * argv[] = { "grep", string, (char *) NULL };
      execvp("grep", argv);
    }

    close(lssort[0]);
    close(lssort[1]);

    close(sortgrep[0]);
    close(sortgrep[1]);

    close(STDIN_FILENO);
    close(STDOUT_FILENO);

    wait(0);
    wait(0);

    return 0;
    ...

Мой ожидаемый результат при запуске программы будет

  1. 'ls -lR [-ddir]'выводит содержимое каталога (необязательно заданного / текущего рабочего) и передает его по каналу' lssort 'к следующему дочернему процессу (sort)
  2. ' sort 'сортирует содержимое, полученное из канала' lssort 'и направляет результаты через «sortgrep» следующему дочернему процессу (grep)
  3. «grep string [-foutfile]» выбирает строки, которые соответствуют заданному шаблону (строке), и печатает их в стандартный вывод или, если он определен вфайл журнала (outfile)

На самом деле программа просто продолжает работать / ждет ввода.Когда я запускаю top в другом терминале, я вижу, что sort и grep спят.

...