Zmienić proces nadrzędny procesu?


14

Czy można zmienić proces macierzysty procesu? Jeśli tak to jak?

Na przykład,

  • jak screenzarządza dołączeniem screensesji i procesów w niej działających do różnych procesów powłoki? Czy nastąpiła zmiana procesu macierzystego?

  • Wydaje mi się, że słyszałem o innych sposobach zmiany procesu powłoki, w których działa program, ale nie pamiętam. Czy jest także zmiana procesu macierzystego programu?

  • Myślałem, że disownproces zmienia proces macierzysty procesu, po prostu dlatego, że nazwa disowntego sugeruje. Ale stwierdziłem, że to nieprawda.

  • Klient Emacs może podłączyć się do serwera emacs na innej karcie terminala. Czy nastąpiła zmiana procesu macierzystego?


disownpo prostu usuwa dane dziecko z wewnętrznej listy procesów potomnych powłoki. PPID dziecka pozostaje w powłoce. Powłoka zapomniała, że ​​kiedyś zaczęła to dziecko, ale jądro to pamięta.
Warren Young,

Czy proces pamięta swojego rodzica?
Tim

Jeśli chce wiedzieć, to wywołuje getppid(2), wywołuje system, a wywołania systemowe są obsługiwane przez jądro. Program można pomylić, wydając to wywołanie, zapisując wartość, a następnie używając tej wartości po zmianie jego pochodzenia. Istnieje tutaj szansa na wyścig.
Warren Young,

Brzmi jak interesująca nowa funkcja jądra.
ChuckCottrill

Odpowiedzi:


14

Identyfikatora procesu nadrzędnego (ppid) procesu nie można zmienić poza jądrem; nie ma wywołania systemowego setppid. Jądro zmieni ppid na (pid) 1 dopiero po zakończeniu procesu macierzystego przez proces - jeśli proces nie odpowiedział na sygnał, że rodzic został zakończony. Aby tak się stało, potrzeby procesu zignorowali różne sygnały ( SIGHUP, SIGTERM, itd.) Wcześniej.

screen(1)ma bardzo elegancki sposób radzenia sobie z odłączaniem i ponownym podłączaniem. Podczas pierwszego uruchomienia screenfaktycznie uruchamiasz interfejs użytkownika (ui), który domyślnie utworzy demona (menedżera sesji). Ten demon nie jest z nim powiązany, nowa grupa procesów ( setpgrp(2)), nowy identyfikator sesji ( setsid(2)). Demon, działający jako SCREEN, utworzy następnie podprocesy połączone z pseudo-terminalami ( pty), a następnie multipleksuje dane z ptys i ui ( screen). Podprocesy myślą, że rozmawiają z prawdziwym terminalem.

Jeśli interfejs użytkownika screenzakończy działanie, demon SCREENbędzie nadal działał, buforując dane, przetwarzając sygnały, czekając na nowy interfejs itp., Ponieważ jest to inna grupa procesów i we własnej sesji. Po ponownym podłączeniu z nowym interfejsem screendemon będzie nadal multipleksował, tak jak wcześniej. Demon będzie działał, dopóki wszystkie podprocesy nie zakończą się, nie zostaną zabite, wystąpi błąd krytyczny lub host uruchomi się ponownie.


Dzięki. Dodałem „Klient Emacs może podłączyć się do serwera emacs na innej karcie terminala. Czy nastąpiła zmiana procesu nadrzędnego?”
Tim

1
Każdy proces ma tylko jednego rodzica, dopóki albo rodzic nie umrze, albo umrze. Jeśli umrze, chodzi o dyskusję. Jeśli rodzic umiera, wówczas PPID staje się 1, initprocesem. Jest to jedyny czas, w którym proces nadrzędny zmieniłby się - gdy proces nadrzędny zakończy się. Łączenie za pośrednictwem komunikacji międzyprocesowej (rury, gniazda itp.) Nie ma wpływu na PPID.
Arcege

W jaki sposób Emacs dołącza klienta do serwera na różnych kartach terminali?
Tim

Serwer nasłuchuje na gnieździe (zwykle pliku gniazda domeny UNIX), czekając na połączenia. Klient (y) otworzy połączenie w tym gnieździe. Karty nie mają związku z komunikacją między klientem a serwerem, mogą mieć różne karty, różne emulacje teminal (xterm vs rxvt vs terminal) lub mogą być xemacs. Każdy klient wie, gdzie się połączyć, więc może być z dowolnego miejsca.
Arcege

1
Identyfikator procesu nadrzędnego nie zawsze staje się 1. Otrzymany absolutyzm mądrości jest błędny od ponad 3 lat.
JdeBP

-2

Rozumiem. Musisz zmienić jądro, aby napisać moduł, aby to zrobić! Myślę, że w niektórych przypadkach przyda się. Na przykład wykonujesz długą ciężką pracę, która zajmuje wiele zasobów przez godzinę ... A gdy system nie odpowiada (jak zwykle w tym przypadku), wykonujesz nieprzewidywalne działania (z powodu twojej potrzeby i nie masz pewności, że klikasz mysz w odpowiednim miejscu, aby system nie reagował przez długi czas) i zabić przypadkowo proces nadrzędny. System zwykle zabija wszystkie dzieci! Ale jeśli proces potomny jest rootem, a rodzic jest tylko zwykłym użytkownikiem i akcja czyni go również zwykłym użytkownikiem, proces ten w żadnym wypadku nie zostanie zabity! A jego rodzic będzie inicjował z PID 1. A po ostatniej odpowiedzi systemu chcesz przywrócić hierarchię. Ale nie możesz !!! Standardowo zaczynasz aktualizować system jako root z terminala jako zwykły użytkownik z su. Dlaczego? Aby uzyskać wszystkie błędy i ostrzeżenia na konsoli. Szczególnie narzędziem do aktualizacji jest GUI. Dostają te informacje do zera ... Pamiętam, że w systemie operacyjnym Windows można to zrobić. Istnieją specjalne funkcje WinAPI. Dlaczego w Linuksie nie można tego zrobić? Nie jest jasne ... To prosta sprawa !!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.