本帖最后由 古月不傲 于 2020-12-21 15:42 编辑
SIGHUP信号
谈及信号先说一下进程、进程组、会话之间的关系
什么是程序?
程序: 不消耗系统资源,只占用磁盘空间的二进制代码。
什么是进程?
进程: 一个程序正在被运行,产生系统资源(cpu, memory)。
什么是进程组?
一个或多个进程的组合。
什么是会话?
一个或多个进程组的组合。
一些关键字
UID: 用户ID
PID: 进程ID
SID: 会话ID
TTY: 终端
有关linux信号的知识,请自行查阅资料。
SIGHUP(连接断开信号)
当我们关闭终端时会执行一下动作。
- 系统发送SIGHUP,当bash收到此信号,缺省动作是发送此信号给当前会话中的所有进程,kill所有进程,然后再kill自己。
信号跟踪工具 strace
sudo strace -e trace=signal -p pid
怎样不让终端杀死自己
- 进程拦截SIGHUP信号,ignore it。
- 进程不归bash管理,不在一个会话中。
忽略它即可
signal(SIGHUP, SIG_IGN);
while(1) {
printf("Hello World!\n");
std::this_thread::sleep_for(1s);
}
此时的进程会变成孤儿进程,由systemd守护进程领养。
pid_t pid = fork();
if (pid < 0) {
printf("fork failed!\n");
exit(0);
}
else if (pid == 0) {
setsid();
while(1) {
printf("son execute!\n");
std::this_thread::sleep_for(1s);
}
}
else {
while(1) {
printf("parent execute!\n");
std::this_thread::sleep_for(1s);
}
}
测试结果
before
PID PPID SID TT PGRP COMMAND
18478 18468 18478 pts/0 18478 bash
23760 18468 23760 pts/1 23760 bash
23781 23760 23760 pts/1 23781 testwind
23782 23781 23782 ? 23782 testwind
after
PID PPID SID TT PGRP COMMAND
18478 18468 18478 pts/0 18478 bash
23782 3202 23782 ? 23782 testwind
setsid()函数对于进程组的leader来说无效。
子进程创建新的会话,此时在退出终端只会kill父进程
此时的进程会变成孤儿进程,由systemd守护进程领养
|