Unix pipe (|) che pipeline l'output di un processo a un altro e pipe che creiamo usando "pipe (int pipefd [2])" in c utilizzato per la comunicazione tra processi allo stesso modo?Sono unix pipe (|) e pipe che creiamo usando "pipe (int pipefd [2])" in c lo stesso?
risposta
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.
Il tubo di scappamento |
viene implementato utilizzando le chiamate di sistema pipe(2)
e dup2(2)
.
Vedere Unix Pipes.
Il pipe(2)
syscall utilizzato da gusci per tubazioni con l'operatore |
|
è l'attuazione di coperture, utilizza il intenally pipe()
syscall.
perché vengono creati duplicati? non possiamo scrivere e leggere i dati senza duplicarli? –
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. –
@PsAkshay perché grep e cat eseguiti solo leggono/scrivono da 0 e 1, non da pipefd. –