Czy rura unix (|) przesyła sygnał wyjściowy procesu do innego i rura, którą utworzymy za pomocą "pipe (int pipefd [2])" w c używane do komunikacji między procesami to samo?Czy rura unix (|) i rura są tworzone za pomocą "pipe (int pipefd [2])" wc tym samym?
Odpowiedz
Nie są one całkiem takie same w tym sensie, że wywołanie pipe(2)
nie wystarczy do zaimplementowania równoważnej funkcji powłoki |
.
pipe(2)
tworzy dwa deskryptory plików (przeczytaj koniec i koniec zapisu). Ale musisz zrobić więcej, aby zaimplementować funkcjonalność |
.
Typowa sekwencja tworząc rurę idzie tak:
1) Utwórz odczytu koniec i koniec zapisu przy użyciu pipe(2)
.
2) Utwórz proces potomny za pomocą fork()
.
3) Procesy macierzyste i podrzędne duplikują deskryptory plików przy użyciu dup2()
.
4) Oba procesy zamykają jeden koniec rury (jeden koniec rury, którego nie używa każdy proces).
5) Jeden pisze do rury i inne odczyty z rury.
Rozważ prosty przykład, aby to pokazać. W tym przypadku przekazujemy nazwę pliku jako argument, a proces nadrzędny "przegląda" plik, który jest podrzędny dla pliku cat
.
#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);
}
}
Odpowiada to robi
cat file | grep search_word
na skorupce.
Rura osłonowa |
jest zaimplementowana przy użyciu wywołań systemowych pipe(2)
i dup2(2)
.
Zobacz Unix Pipes.
pipe(2)
syscall wykorzystywane przez powłoki dla rurociągów z operatorem
|
|
jest wykonanie powłoki, to intenally wykorzystuje pipe()
wywołania systemowego.
- 1. rura JSON w Kątowymi 2 nie pracuje
- 2. Uszkodzona rura (Errno :: EPIPE)
- 3. Ruby TrueClass pojedyncza rura
- 4. SIGPIPE, Uszkodzona rura
- 5. Django + WebKit = Uszkodzona rura
- 6. Rura między gniazdami
- 7. rura ucieczki ("|") w regex
- 8. Co robi rura w tym wyrażeniu AngularJS
- 9. PowerShell rura v3.0 problem
- 10. Co to jest zanieczyszczona rura w Angular?
- 11. bash rura SIGTERM
- 12. Rura strumienia MJPEG za pośrednictwem proxy Node.js
- 13. Angular2 custom rura nie została znaleziona
- 14. Rura w "muszlę adb"
- 15. jak rura wielokrotnego sql- i PY-skrypty
- 16. Uszkodzona rura podczas przesyłania strumieniowego
- 17. Kątowa 2 rura - ograniczenie do 2 miejsc po przecinku
- 18. NReco.PdfGenerator Rura została zakończona błędem na serwerze
- 19. Dlaczego ta rura jest zakończona?
- 20. F # rura do przodu przekonwertować z int do bigint
- 21. Angular 2 data pipe wewnątrz Input FormControl
- 22. rura tu komenda dokument do pliku dziennika
- 23. Okna Plik wsadowy - rura do ZNAJDŹ
- 24. rura wyjściowa ogon do innego skryptu
- 25. Co dokładnie oznacza wyjątek "zepsuta rura" dla gniazda?
- 26. rura postgresowa KOPIA w pythonie z psycopg2
- 27. Rura strumienia wejściowego i wyjściowego w języku Java
- 28. Wielokrotne zapytanie COUNT na tym samym typie jednostki za pomocą Symfony 2.1 i Doctrine 2
- 29. Dlaczego rura resetuje bieżący katalog roboczy?
- 30. java.sql.SQLException: wyjątek Io: Uszkodzona rura, jak odzyskać bez restartu?
Dlaczego tworzone są duplikaty? czy nie możemy pisać i czytać danych bez duplikowania? –
Nie jest to bezwzględnie konieczne ('dup2()') we wszystkich procesach komunikacji rodzic-dziecko. Ty rodzic i dziecko również potraficie komunikować się bezpośrednio. Na przykład rodzic może "napisać (2)" na końcu zapisu rury, a element potomny może "odczytać (2)" z końca odczytu. –
@PsAkshay, ponieważ wykonane grep i cat tylko odczyt/zapis z 0 i 1, a nie pipefd's. –