Я пытаюсь написать программу, которая будет порождать произвольное количество дочерних процессов и соединять их между собой, подобно конвейеру командной строки. В моем случае я пытаюсь сделать «ls -l | more» и вывести это на стандартный вывод, а затем родительский элемент продолжит выполнение других команд.
У меня есть следующий код в качестве минимального примера:
int main (int argc, const char * argv[]) {
int fd[2];
pipe(fd);
chdir("/directory/with/lots/of/files");
// Create one child process for more
int pid = fork();
if (pid == 0) {
close(fd[1]);
int ret = dup2(fd[0],0);
if (ret < 0) perror("dup2");
char *argv[10];
argv[0] = "more"; argv[1] = NULL;
execvp("more", argv);
}
// Create another child process for ls
int pid2 = fork();
if (pid2 == 0) {
int ret = dup2(fd[1],1);
if (ret < 0) perror("dup2");
char *argv[10];
argv[0] = "ls"; argv[1] = "-l";
argv[2] = NULL;
execvp("ls", argv);
}
// wait for the more process to finish
int status;
waitpid(pid, &status, 0);
printf("Done!\n");
return 0;
}
Теперь, когда я выполняю программу (конечно, заключенную в функцию main()), я получаю больше, чем ожидалось. Я нажму «d», чтобы пролистать больше вывода, и «u», чтобы перейти вверх, и, похоже, это работает нормально. Но когда я достигаю дна, вместо того, чтобы выйти, как это делает больше, он просто оставляет пустую строку. Ctrl-C работает, чтобы выйти из него, но он закрывает всю программу, что означает «Готово!» строка никогда не печатается. Видео доступно здесь, иллюстрирующее происходящее (обратите внимание, что в самом конце я нажимаю Ctrl-C, чтобы вернуться к bash).
Есть мысли по этому поводу? Я просто пытаюсь понять, как изменить его на то, где вместо того, чтобы переходить к пустой строке после того, как больше достигает дна, больше уходит и возвращается к родительскому процессу, чтобы он мог продолжить выполнение.
more
символической ссылкой наless
. Меньше требуется-e
для выхода в конце файла. Возможно, есть разница вPATH
в среде вашей программы и в вашей интерактивной среде. - person Dennis Williamson   schedule 21.02.2011