2015-12-14 16 views

risposta

5

Non sono esattamente la stessa cosa nel senso che chiama pipe(2) non è sufficiente per implementare la funzione equivalente di shell |.

pipe(2) crea due descrittori di file (leggi fine e fine scrittura). Ma è necessario fare di più per implementare la funzionalità |.

tipica sequenza di creare un tubo così:

1) Creare un'estremità lettura ed un'estremità di scrittura utilizzando pipe(2).

2) Creare un processo figlio utilizzando fork().

3) I processi padre e figlio duplicano i descrittori di file utilizzando dup2().

4) Entrambi i processi, ognuno chiude un'estremità del tubo (l'estremità del tubo che non viene utilizzata da ogni processo).

5) Uno scrive sul tubo e altre letture dal tubo.

Considera un semplice esempio per dimostrarlo. In questo si passa un nome file come argomento e il processo padre "greps" il file che è cat dal bambino.

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

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

    char *cat_args[] = {"cat", argv[1], NULL}; 
    char *grep_args[] = {"grep", "search_word", NULL}; 

    pipe(pipefd); 
    pid = fork(); 

    if (pid != 0) 
    { 
     dup2(pipefd[0], 0); 
     close(pipefd[1]); 
     execvp("grep", grep_args); 
    } 
    else 
    { 
     dup2(pipefd[1], 1); 
     close(pipefd[0]); 
     execvp("cat", cat_args); 
    } 
} 

Ciò equivale a fare

cat file | grep search_word 

sul guscio.

+0

perché vengono creati duplicati? non possiamo scrivere e leggere i dati senza duplicarli? –

+1

Non è strettamente necessario ('dup2()') in tutte le comunicazioni del processo genitore-figlio. Anche i genitori e i figli potrebbero comunicare direttamente. Ad esempio, il genitore può 'write (2)' nella fine della scrittura della pipe e child può 'read (2)' dal read end. –

+0

@PsAkshay perché grep e cat eseguiti solo leggono/scrivono da 0 e 1, non da pipefd. –

6

Il tubo di scappamento | viene implementato utilizzando le chiamate di sistema pipe(2) e dup2(2).

Vedere Unix Pipes.

0

Il pipe(2) syscall utilizzato da gusci per tubazioni con l'operatore |

| è l'attuazione di coperture, utilizza il intenally pipe() syscall.