Защо всички процеси се убиват, когато терминална сесия приключи?

Неотдавна се чудех на въпроса: защо всички процеси се убиват, когато затворите терминал на Linux, а не се предават на процеса "init" (с pid 1)? Тъй като всички дъщерни процеси се приемат от процеса "init" след прекратяване на родителския. Моля, помогнете ми да разбера разликата и грешките в разсъжденията си.

И също така: Ако е възможно, тогава можем ли да използваме системно повикване, за да спрем това да се случва? Мисля, че за това програмите трябва да използват setsid(), но на практика не е правилно.


person Simplex    schedule 14.09.2012    source източник


Отговори (3)


защо при затваряне на терминал на linux всички негови процеси ще бъдат прекратени, но не и прехвърлени към процеса "init" (с pid 1)

Процесите губят контролния си терминал, така че ядрото им изпраща SIGHUP. Действието по подразбиране на SIGHUP е да прекрати процеса.

person cnicutar    schedule 14.09.2012
comment
Мога ли да направя в моята програма аналог? Кое системно обаждане се използва за това? - person Simplex; 14.09.2012
comment
Но setsid() връща -1. Използвам setsid() и след като създам няколко процеса с помощта на fork(). - person Simplex; 14.09.2012
comment
@Simplex Време е да изровим Stevens (Advanced Programming in the Unix Environment) или Rochkind, или подобна книга. Въпросът е разгледан подробно. Част от трика е, разбира се, дъщерният процес да игнорира SIGHUP. - person Jonathan Leffler; 14.09.2012
comment
@JonathanLeffler Но ако детето се разграничи от сесията, всичко ще бъде наред, нали? - person cnicutar; 14.09.2012
comment
Това също е друг начин да го направите. Уловката обаче е да се уверите, че сте напълно отделени от терминал. Можете също да използвате setpgid()setpgrp(), ако нямате нищо против вариантни дефиниции на това, което прави). - person Jonathan Leffler; 14.09.2012
comment
Можете да вършите работата си на екран и да се отделите от него, преди да излезете от терминала/да излезете. Прикрепете отново към екрана от друга сесия и той пак ще бъде там и ще работи. - person Omnikrys; 14.09.2012
comment
Добре благодаря. Проучвам този въпрос подробно чрез книгата на Стивънс - person Simplex; 14.09.2012

Както е обяснено от cnicutar, това се дължи на SIGHUP, изпратен до всички процеси в групата процеси, свързана с управляващия терминал. Можете или да инсталирате манипулатор за този сигнал, или да го игнорирате напълно. За произволни програми можете да ги стартирате с помощната програма nohup, предназначена за тази цел.

Можете също да поставите процеса в нова група процеси без управляващ терминал.

person Jens    schedule 14.09.2012

мисля, че това ще ви помогне да разберете http://www.digipedia.pl/usenet/thread/18802/10189/

person Charan Pai    schedule 14.09.2012