问题描述
- linux会话结束时进程关系变化
-
一个会话里有多个进程组运行着,当会话首进程(可能是login shell)
终止(可能是被kill或shell退出引起),那么此时该会话里的进程会怎样,会收到
哪些信号,是否全程成为孤进程组?
解决方案
好像没有什么情况发生。
_> cat a.c
#include
#include
void stat(void)
{
printf("pid=%d, pgid=%d, sid=%dn", getpid(), getpgid(0), getsid(0));
}
int main()
{
fork();
stat();
setpgid(0, 0);
stat();
pause();
}
setsid a
pid=17060, pgid=17060, sid=17060
pid=17060, pgid=17060, sid=17060
pid=17061, pgid=17060, sid=17060
pid=17061, pgid=17061, sid=17060ps -j f
PID PGID SID TTY STAT TIME COMMAND
17060 17060 17060 ? Ss 0:00 ./a
17061 17061 17060 ? S 0:00 _ ./akill 17060
ps -j f
PID PGID SID TTY STAT TIME COMMAND
17061 17061 17060 ? S 0:00 ./a_
解决方案二:
不好意思,说错了,应该是会成为orphan process group。如果已经处于STOP状态,会收到HUP+CONT信号。
#include
#include
#include
void sig(int nr)
{
printf("%d: got %dn", getpid(), nr);
}
void show(void)
{
printf("pid=%d, ppid=%d, pgid=%d, sid=%dn", getpid(), getppid(), getpgid(0), getsid(0));
}
int main()
{
signal(SIGHUP, sig);
fork();
show();
setpgid(0, 0);
show();
kill(getpid(), SIGTSTP);
perror("kill");
show();
}
setsid a
pid=19464, ppid=1, pgid=19464, sid=19464
pid=19464, ppid=1, pgid=19464, sid=19464
pid=19465, ppid=19464, pgid=19464, sid=19464
pid=19465, ppid=19464, pgid=19465, sid=19464
kill: Operation not permitted
pid=19464, ppid=1, pgid=19464, sid=19464
19465: got 1 <------------------- here
kill: Success
pid=19465, ppid=1, pgid=19465, sid=19464