2010-09-04 7 views

Odpowiedz

2

Można również użyć pipe(2,3p). Utwórz rurę, widelec, powtórz odpowiedni koniec rury na FD 0 lub FD 1 dziecka, a następnie wykonaj.

25

Mały przykład z dwoma pierwszymi poleceniami. Musisz utworzyć potok z funkcją pipe(), która będzie działała między ls a grep i innymi potokami między grep i innymi. To, co robi dup2, to kopiowanie deskryptora pliku do innego. Rura działa poprzez podłączenie wejścia w fd [0] do wyjścia fd [1]. Powinieneś przeczytać strony man of pipe i dup2. Mogę spróbować uprościć ten przykład później, jeśli masz inne wątpliwości.

#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

można poprawić za pomocą tylko jednego widelca() i przy użyciu oryginalnego procesu zarówno dla ls lub grep, ale dobrze, że zostawiam wam: P – theprole

+0

Jak powinniśmy rura wyjście do grep więcej. Czy to tylko połączenie dwóch procesów? – CanCeylan

+1

Czy nie powinieneś zamykać WRITE_END dla grep i READ_END dla ls (naprzeciwko tego, co zrobiłeś)? –