Змінити батьківський процес процесу?


14

Чи можливо змінити батьківський процес процесу? Якщо так, то як?

Наприклад,

  • як screenвдається приєднати screenсеанс та процеси, що працюють всередині нього, до різних оболонок? Чи є зміна батьківського процесу?

  • Здається, я чув про інші способи зміни оболонки, в яких працює програма, але я не пам'ятаю. Чи є також зміна батьківського процесу програми?

  • Я думав, disownщо процес змінює батьківський процес процесу, просто тому, що назва це disownозначає. Але я виявив, що це неправда.

  • Клієнт Emacs може приєднатися до сервера emacs на іншій вкладці терміналу. Чи є зміна батьківського процесу?


disownпросто видаляє задану дитину із внутрішнього списку дочірніх процесів оболонки. PPID дитини залишається рівним оболонки. Оболонка забула, що коли-небудь заводила цю дитину, але ядро ​​пам’ятає.
Воррен Янг

Чи пам’ятає процес свого батька?
Тім

Якщо вона хоче знати, getppid(2)ядро обробляє дзвінки , системний виклик та системні дзвінки. Програму можна плутати, видаючи цей виклик, зберігаючи значення та використовуючи це значення після зміни його батьківського стану. Тут є шанс на стан гонки.
Воррен Янг

Здається, нова цікава функція ядра.
ChuckCottrill

Відповіді:


14

Батьківський ідентифікатор процесу (ppid) процесу не може бути змінений поза ядром; немає системного виклику setppid. Ядро змінить ppid на (pid) 1 тільки після того, як батько процесів припиниться - якщо процес не відповів на сигнал про те, що батьківське припинено. Для того щоб це відбулося, потреба процесу, ігнорують різні сигнали ( SIGHUP, SIGTERMі т.д.) заздалегідь.

screen(1)має дуже елегантні засоби поводження з від'єднанням та повторним приєднанням. Під час першого запуску screenви фактично запускаєте інтерфейс користувача (ui), який за замовчуванням створить демон (менеджер сеансів). Цей демон не пов'язаний з ним терміналом, нова група процесів ( setpgrp(2)), новий ідентифікатор сеансу ( setsid(2)). Демон, що працює як SCREEN, створить підпроцеси, підключені до псевдотерміналів ( pty), а потім мультиплексує дані з ptys та ui ( screen). Підпроцеси думають, що вони розмовляють із справжнім терміналом.

Якщо інтерфейс screenприпиняється, демон SCREENвсе ще буде працювати, буферизувати дані, обробляти сигнали, чекати нового інтерфейсу тощо, тому що це інша група процесів і власний сеанс. Коли ви повторно встановите новий інтерфейс screen, демон продовжить мультиплексувати, як це було раніше. Демон буде працювати продовжувати, поки всі підпроцеси не припиняться, не вбиваються, не виникає фатальна помилка або хост перезавантажується.


Спасибі. Я додав "Клієнт Emacs може приєднатися до сервера emacs на іншій вкладці терміналу. Чи є зміна батьківського процесу?"
Тім

1
Кожен процес має лише одного з батьків, поки або не помер, або він помер. Якщо вона вмирає, справа в суперечці. Якщо батько помирає, то PPID стає 1, initпроцес. Це єдиний час, коли батьківський процес зміниться - коли батьківський процес припиняється. Підключення за допомогою міжпроцесорного зв'язку (труби, розетки тощо) не впливає на PPID.
Арседж

Як Emacs приєднує клієнта до сервера на різних вкладках терміналів?
Тім

Сервер слухав би сокет (зазвичай файл сокета домену UNIX), очікуючи на з'єднання. Клієнт (и) відкриє з'єднання з цим сокетом. Вкладки не мають відношення до зв'язку між клієнтом і сервером, вони можуть мати різні вкладки, різні тимчасові емуляції (xterm vs rxvt vs terminal), або можуть бути xemacs. Кожен клієнт знає, куди підключитися, тому може бути з будь-якого місця.
Арседж

1
Ідентифікатор батьківського процесу не завжди стає 1. Цей отриманий абсолютизм мудрості помиляється вже понад 3 роки.
JdeBP

-2

Я розумію. Для цього вам потрібно змінити ядро, щоб написати якийсь модуль! Я думаю, що це буде корисно в деяких випадках. Наприклад, ви виконуєте довгу важку роботу, вони забирають багато ресурсів протягом години ... І коли система не реагує (як зазвичай в цьому випадку), ви робите деякі непередбачувані дії (через це вам потрібно зробити, і ви не впевнені, що натискаєте миша в правильному місці, щоб система довго не відповідала) і вбила випадково батьківський процес. Система зазвичай вбиває всіх дітей! Але якщо дочірній процес є кореневим і лише батьківським порядковим користувачем, а дії теж роблять звичайного користувача, цей процес ні в якому разі не вбивається! І його батько буде ініційований PID 1. І після того, як система нарешті відповість, ви хочете відновити ієрархію. Але ти не можеш !!! Стандартно ви запускаєте систему оновлення як root від терміналу, як звичайний користувач з su. Чому? Отже, щоб отримати всі помилки та застереження на консолі. Особливо утиліта для оновлення - це графічний інтерфейс. Вони отримують цю інформацію ні до чого ... Я пам’ятаю, що в ОС Windows це можна зробити. Існують спеціальні функції WinAPI. Чому в Linux це зробити не можна? Це не зрозуміло ... Його проста річ !!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.