Czy można mieć potok między dwoma procesami potomnymi utworzonymi przez tego samego rodzica (LINUX, POSIX)
Mam kilka procesów potomnych „rozwidlonych” od tego samego rodzica i próbuję zbudować relację
pipepomiędzy wszystkimi tymi procesami podrzędnymi, taką jak połączona struktura listy. Dziecko 1 wysyła dane do dziecka 2, dziecko 2 do dzieci 3 .... do dziecka H w przypadku dziecka 1. Czy istnieje właściwy sposób, aby to zrobić?
Ponadto, jeśli tworzę procesy i komunikuję się między nimi, jak zmusić rodzica, aby „czekał” na zakończenie pracy całego procesu, skoro
wait ()lub
waitpid ()czeka na pierwszy zakończony proces, ale muszę poczekać na wszystkie. Powstaje kolejne pytanie.
Podziękować...
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
3 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Istnieje kilka doskonałych tekstów wprowadzających do programowania w systemie Unix, które mają prostą powłokę zaimplementowaną za pomocą książki. Jednym z zadań jest przekierowanie powłoki. Jedną z takich książek jest „41” autorstwa Michaela C. Johnsona i Erica W. Troana.
Strona główna książki:
http://ladweb.net
http://ladweb.net/
/
Aby zbudować łańcuch przekierowań dla N procesów, potrzebujesz N-1 potoków. Dla każdego przekierowania tworzysz potok przy użyciu wywołania systemowego
pipe (int fds [2])
. Po ing, ale przed ing użyj - "podłącz" koniec potoku do standardowego wejścia (0 ) lub standardowe wyjście każdego procesu. Oto nadmiernie uproszczony kod, bez sprawdzania błędów:Zauważ, że indeksy tablicy potoków zostały wybrane tak, aby odzwierciedlały standardowe deskryptory plików wejścia/wyjścia używane do przekierowania stdio. Ten wybór nie był arbitralny.
Możesz oczywiście podłączyć potoki do dowolnych deskryptorów plików (na przykład istnieją aplikacje, które oczekują, że ich rodzic otworzy, powiedzmy fd 3 i 4 podłączone do potoków), a większość powłok bezpośrednio to obsługuje (np. 1 & > & amp; 3 przekieruje standardowe wyjście do fd 3). Jednak indeksy tablicowe dla
pipe (int fds [2])
to oczywiście 0 i 1. Powtarzam to tylko dlatego, że miałem kilku studentów programowania kultowego cargo, którzy bezmyślnie brali również docelowe fds dla tablicy potoków syscall.Aby poczekać na zakończenie wszystkich procesów podrzędnych, użyj - myślę, że to jest -1, co miał na myśli mój pre-responder, co oznacza: czekaj na wszystkie dziecko procesy do zakończenia. Inną opcją było wywołanie w pętli, która zwróci pid właśnie ukończonego dziecka. Jeśli zostanie ponownie wezwany, a dziecko nadal pracuje, zostanie ponownie zablokowane. Jeśli nie ma już dziecka, zwróci -1; Wolę rozwiązanie .
Anonimowy użytkownik
Potwierdzenie od:
Pozostawienie otwartych FD rur dla dzieci, które ich nie używają, jest NIEUDANE, ponieważ może spowodować, że inni będą czekać wiecznie na koniec rury. Wszyscy autorzy muszą zamknąć się, zanim czytelnik otrzyma EOF.
Anonimowy użytkownik
Potwierdzenie od:
Jeśli chodzi o czekanie, po prostu czekaj, aż zwróci -1.