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.
- 1. pipe Unix in ls
- 2. unix pipe più scrittori
- 3. pipe() e fork() in c
- 4. pipe UNIX on C block on read
- 5. IPC vs dominio pipe vs named pipe
- 6. Coding pipe multiple in C
- 7. C: dup2, pipe e fork non funzionano come previsto
- 8. Implementazione di pipe in una shell C (Unix)
- 9. pipe denominate Windows e
- 10. Crea named pipe C++ Windows
- 11. "Sub-parser" in pipe-attoparsec
- 12. createReadStream(). Pipe() Callback
- 13. Come concatenare lo stdin in una pipe?
- 14. Può popen() creare pipe bidirezionali come pipe() + fork()?
- 15. pipe (|) operatore in Java
- 16. Python: subprocess.call pipe interrotte
- 17. Named pipe in Java e multithreading
- 18. C++ Utilizzo di pipe denominate Windows
- 19. Opzioni per il | (pipe) comando
- 20. Monitoraggio per pipe denominate in C#
- 21. Come svuotare una pipe usando la bash
- 22. System.IO.Exception: Pipe è rotto
- 23. Coda pipe vs msg
- 24. F # pipe first parameter
- 25. bash pipe & SIGTERM
- 26. Comando pipe to export
- 27. C# Tutte le istanze di pipe sono occupate
- 28. Distinguere una pipe da un file in Unix
- 29. fuga pipe ("|") in una regex
- 30. Scala - comandi shell con pipe
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. –