吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1338|回复: 0
收起左侧

[讨论] SIGHUP信号

[复制链接]
古月不傲 发表于 2020-12-20 19:06
本帖最后由 古月不傲 于 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

怎样不让终端杀死自己

  1. 进程拦截SIGHUP信号,ignore it。
  2. 进程不归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守护进程领养

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 09:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表