Czy można zmienić proces macierzysty procesu? Jeśli tak to jak?
Na przykład,
jak
screen
zarządza dołączeniemscreen
sesji 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
disown
proces zmienia proces macierzysty procesu, po prostu dlatego, że nazwadisown
tego 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?
disown
po 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.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.Odpowiedzi:
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 uruchomieniascreen
faktycznie 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 jakoSCREEN
, 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
screen
zakończy działanie, demonSCREEN
bę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 interfejsemscreen
demon 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.źródło
init
procesem. 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.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 !!!
źródło