linux alarm 实现原理,linux 信号机制

1. Linux支持的信号列表如下。很多信号是与机器的体系结构相关的

信号值 默认处理动作 发出信号的原因

SIGHUP 1 A 终端挂起或者控制进程终止

SIGINT 2 A 键盘中断(如break键被按下)

SIGQUIT 3 C 键盘的退出键被按下

SIGILL 4 C 非法指令

SIGABRT 6 C 由abort(3)发出的退出指令

SIGFPE 8 C 浮点异常

SIGKILL 9 AEF Kill信号

SIGSEGV 11 C 无效的内存引用

SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道

SIGALRM 14 A 由alarm(2)发出的信号

SIGTERM 15 A 终止信号

SIGUSR1 30,10,16 A 用户自定义信号1

SIGUSR2 31,12,17 A 用户自定义信号2

SIGCHLD 20,17,18 B 子进程结束信号

SIGCONT 19,18,25 进程继续(曾被停止的进程)

SIGSTOP 17,19,23 DEF 终止进程

SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键

SIGTTIN 21,21,26 D 后台进程企图从控制终端读

SIGTTOU 22,22,27 D 后台进程企图从控制终端写

2. 创建信号集

sigset_t initset;

sigemptyset(&initset);//初始化信号集合为空集合

sigaddset(&initset,SIGINT);//将SIGINT信号加入到此集合中去

sigprocmask(SIG_BLOCK,&initset,NULL);//将信号集合加入到进程的阻塞集合中去 失败返回-1//创建一个fd进行监听int create_signal_fd ( void ){    sigset_t attention_signal;

sigemptyset ( &attention_signal );

sigaddset ( &attention_signal,SIGPIPE );    return sigprocmask ( SIG_BLOCK, &attention_signal,NULL ) 

}//监听fd,根据产生中的信号做相应处理signalfd_siginfo signal_buf;if ( signal_buf.ssi_signo==SIGPIPE ) {

LOG(INFO) <

}

3. 简单的信号处理函数signal()

#include

void (signal(int signum, void (handler))(int)))(int);

如果该函数原型不容易理解的话,可以参考下面的分解方式来理解:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler));

第一个参数指定信号的值,第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIG_IGN);可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)。

如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回SIG_ERR。

传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。#include #include #include void sigroutine(int dunno){ /* 信号处理例程,其中dunno将会得到信号的值 */

switch (dunno) {        case 1:        printf("Get a signal -- SIGHUP ");        break;        case 2:        printf("Get a signal -- SIGINT ");        break;        case 3:        printf("Get a signal -- SIGQUIT ");        break;

}        return;

}

int main() {        printf("process id is %d ",getpid());

signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法

signal(SIGINT, sigroutine);

signal(SIGQUIT, sigroutine);        for (;;) ;

}

//其中信号SIGINT由按下Ctrl-C发出,信号SIGQUIT由按下Ctrl-发出。该程序执行的结果如下:localhost:~$ ./sig_test

process id is 463Get a signal -SIGINT //按下Ctrl-C得到的结果Get a signal -SIGQUIT //按下Ctrl-得到的结果//按下Ctrl-z将进程置于后台

[1]+ Stopped ./sig_test

localhost:~$ bg

[1]+ ./sig_test &

localhost:~$ kill -HUP 463 //向进程发送SIGHUP信号localhost:~$ Get a signal – SIGHUP

kill -9 463 //向进程发送SIGKILL信号,终止进程localhost:~$

作者:Zbertj

链接:https://www.jianshu.com/p/2cf2163412a7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值