2016-01-24 6 views
1

Я понимаю, что там, где вы хотите запустить команду, как ls -l | wc -l:Перенаправление ввода и трубы

int pipes[2]; 
pipe(pipes); 

if (fork() == 0){ //first fork 
    dup2(pipes[1],1); 
    close(pipes[0]); 
    close(pipes[1]); 

    execvp(arr1[0], arr1); //arr1[0] = "ls" and arr1[1] = "-l" and arr1[2] = 0 
    perror("Ex failed"); 
    exit(1); 
} 

if (fork() == 0){ //2nd fork 
    close(pipes[1]); 
    dup2(pipes[0],0); 
    close(pipes[0]); 

    execvp(arr2[0], arr2); //arr2[0] = "wc" and arr2[1] = "-l" and arr2[2] = 0 
    perror("Ex failed"); 
    exit(1); 
} 

Но, как бы вы включили перенаправление ввода и вывода? скажем, хочу кошку < foo.txt | wc -l

Я понимаю, что первая вилка нуждается в модификации, но я не понимаю, что нужно (другой dup2()?). Я был бы очень признателен за помощь.

Спасибо.

+0

Что вы ожидаете достичь с помощью 'dup2 (pipe [1], [1]);'? Это недопустимый синтаксис; Я так понимаю, вы имели в виду 'dup2 (pipe [1], STDOUT_FILENO);'? –

+0

Это была опечатка. Я исправлю это. – user5832523

ответ

0

Но, как бы вы включили перенаправление ввода и вывода? скажем, я хочу кошка < foo.txt | туалет -l

В случае перенаправления ввода, вы открываете файл для чтения, а затем использовать dup2(2) дублировать дескриптор файла в стандартный ввод. Дескриптор файла stdin - STDIN_FILENO, определенный в unistd.h. Так, что-то вроде этого:

#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 

// ... 

filename = "foo.txt"; 
int fd; 
if ((fd = open(filename, O_RDONLY)) == -1) { 
    perror("open %s: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 
if (dup2(fd, STDIN_FILENO) == -1) { 
    perror("dup2: %s -> stdin: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 
if (close(fd) == -1) { 
    perror("close %s: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 

// Now, reading from stdin will read from the file. 
// Do the normal pipe operations here. 

int pipes[2]; 
// ... 

Обратите внимание, что ваш код не обработки ошибок - не один - это очень плохо, потому что когда что-то пойдет не так, вы будете игнорировать его, и код будет врезаться неисповедимы. В значительной степени каждая вызванная вами функция может возвращаться с ошибкой; рассматривая обработку ошибки, чтобы четко показать пользователю, что пошло не так, где.

+0

Это не работает. Я сделал то, что вам посоветовал. Open(), dup2() и закрыть, тогда мои две вилки не изменились. Нет ли дополнительного кода в вилках? – user5832523

+0

@ user5832523 код forking должен оставаться неизменным. Пожалуйста, разместите полный рабочий, компилируемый код, который, по вашему мнению, не работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^