2010-09-04 4 views

ответ

2

Вы бы использовали pipe(2,3p). Создайте канал, вилку, дублируйте соответствующий конец трубы на FD 0 или FD 1 дочернего элемента, а затем exec.

25

Небольшой пример с двумя первыми командами. Вам нужно создать канал с функцией pipe(), которая будет проходить между ls и grep и другим каналом между grep и более. То, что делает dup2, это копирование файлового дескриптора в другой. Труба работает, подключая вход в fd [0] к выходу fd [1]. Вы должны прочитать страницы руководства трубы и dup2. Я могу попытаться упростить пример позже, если у вас есть другие сомнения.

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

#define READ_END 0 
#define WRITE_END 1 

int 
main(int argc, char* argv[]) 
{ 
    pid_t pid; 
    int fd[2]; 

    pipe(fd); 
    pid = fork(); 

    if(pid==0) 
    { 
     printf("i'm the child used for ls \n"); 
     dup2(fd[WRITE_END], STDOUT_FILENO); 
     close(fd[WRITE_END]); 
     execlp("ls", "ls", "-al", NULL); 
    } 
    else 
    { 
     pid=fork(); 

     if(pid==0) 
     { 
      printf("i'm in the second child, which will be used to run grep\n"); 
      dup2(fd[READ_END], STDIN_FILENO); 
      close(fd[READ_END]); 
      execlp("grep", "grep", "alpha",NULL); 
     } 
    } 

    return 0; 
} 
+0

это может быть улучшена за счет использования только одна вилка() и используя оригинальный способ либо Ls или Grep, но хорошо я оставлю это для вас: P – theprole

+0

Как мы должны конвейеру выход Grep в чем больше. Это просто трубопроводы двух процессов? – CanCeylan

+1

Разве вы не должны закрывать WRITE_END для grep и READ_END для ls (напротив того, что вы сделали)? –