Linux中信号的使用

  1. 什么是信号
    信号是硬件终端的软件模拟,用来表示程序运行中发生的各种事件。
  2. 如何主动的发送信号
    使用kill命令
    使用kill函数
    使用alarm()向调用进程发送SIGALRM信号
  3. 如何捕获信号
    一般的捕获信号的步骤是:
    1. 创建一个信号集合
    2. 向信号集合中添加想要捕获的信号
    3. 向内核登记信号处理器
    4. 等候捕捉信号

SIGHUP信号

     UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
     系统对SIGHUP信号的默认处理是止收到信号的程。所以若程序中没有捕捉信号,当收到信号程就会退出。
     下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。login shell是session首进程。
首先写一个测试程序,代码如下:

#include <stdio.h>
#include <signal.h>
char **args;
void exithandle(int sig)
{
        printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
{
        args = argv;
        signal(SIGHUP,exithandle);
        pause();
       return 0;
}

SIGCHLD信号

       子进程死后,会发送SIGCHLD信号给父进程。

        一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程 是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

SIGTERM信号

kill() 可以发 SIGTERM 过去;kill 命令默认也使用 SIGTERM 信号。

SIGTERM 信号的处理函数,常见的是用来清理、退出;或者程序可以忽略这个信号,以防误杀。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值