, я пытался использовать системный вызов pipe () для создания оболочки, поддерживающей конвейер (с произвольным числом команд).
К сожалению, мне не повезло с использованием pipe (). Потратив несколько дней на изучение различных онлайн-ресурсов, я решил составить упрощенную программу, которая будет иметь тот же эффект, что и выполнение ls | sort
, чтобы увидеть, смогу ли я даже заставить работать конвейер для двух дочерних процессов, родных и близких. Вот код:
#include <sys/wait.h>
#include <unistd.h>
void run(char *cmd) {
char *args[2];
args[0] = cmd;
args[1] = NULL;
execvp(cmd, args);
}
int main(void) {
int filedes[2];
pipe(filedes);
pid_t pid_a, pid_b;
if (!(pid_a = fork())) {
dup2(filedes[1], 1);
run("ls");
}
if (!(pid_b = fork())) {
dup2(filedes[0], 0);
run("sort");
}
waitpid(pid_a, NULL, 0);
waitpid(pid_b, NULL, 0);
return 0;
}
Канал создается в родительском элементе, и я знаю, что после вызова execvp () каждый дочерний процесс наследует дескрипторы файлов, которые pipe () создает в родительском. Для процесса ls
я использую dup2 () для перенаправления его стандартного вывода (1) на конец записи канала, а для процесса sort
стандарт в (0 ) перенаправляется в конец канала для чтения.
Наконец, я жду завершения обоих процессов перед выходом.
Моя интуиция подсказывает мне, что это должно сработать, но это не так!
Есть предложения?