Для домашней работы мне нужно создать программу на 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;
...
Мой ожидаемый результат при запуске программы будет
- 'ls -lR [-ddir]'выводит содержимое каталога (необязательно заданного / текущего рабочего) и передает его по каналу' lssort 'к следующему дочернему процессу (sort)
- ' sort 'сортирует содержимое, полученное из канала' lssort 'и направляет результаты через «sortgrep» следующему дочернему процессу (grep)
- «grep string [-foutfile]» выбирает строки, которые соответствуют заданному шаблону (строке), и печатает их в стандартный вывод или, если он определен вфайл журнала (outfile)
На самом деле программа просто продолжает работать / ждет ввода.Когда я запускаю top в другом терминале, я вижу, что sort и grep спят.