Linux信号之signals和sigaction的使用

1.简介

Linux系统进行和信号处理的时候有2个函数可供选择,signals和sigaction
signals函数原型:void (*signal(int signum, void (*func))(int)))(int);
sigaction函数原型:int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
当处理下列31个系统信号使用signals函数也很方便,当然使用sigaction也可,sigaction可以看作是signals函数的升级版,可以做到更多细节问题。
sigaction完全可以替代signals函数并且可以传递一些自定义信号。下面信号定义列表摘自signal.h

/* Signals. */

SIGHUP1/* Hangup (POSIX). */
SIGINT2/* Interrupt (ANSI). */
SIGQUIT3/* Quit (POSIX). */
SIGILL4/* Illegal instruction (ANSI). */
SIGTRAP5/* Trace trap (POSIX). */
SIGABRT6/* Abort (ANSI). */
SIGIOT6/* IOT trap (4.2 BSD). */
SIGBUS7/* BUS error (4.2 BSD). */
SIGFPE8/* Floating-point exception (ANSI). */
SIGKILL9/* Kill, unblockable (POSIX). */
SIGUSR110/* User-defined signal 1 (POSIX). */
SIGSEGV11/* Segmentation violation (ANSI). */
SIGUSR212/* User-defined signal 2 (POSIX). */
SIGPIPE13/* Broken pipe (POSIX). */
SIGALRM14/* Alarm clock (POSIX). */
SIGTERM15/* Termination (ANSI). */
SIGSTKFLT16/* Stack fault. */
SIGCLDSIGCHLD/* Same as SIGCHLD (System V). */
SIGCHLD17/* Child status has changed (POSIX). */
SIGCONT18/* Continue (POSIX). */
SIGSTOP19/* Stop, unblockable (POSIX). */
SIGTSTP20/* Keyboard stop (POSIX). */
SIGTTIN21/* Background read from tty (POSIX). */
SIGTTOU22/* Background write to tty (POSIX). */
SIGURG23/* Urgent condition on socket (4.2 BSD). */
SIGXCPU24/* CPU limit exceeded (4.2 BSD). */
SIGXFSZ25/* File size limit exceeded (4.2 BSD). */
SIGVTALRM26/* Virtual alarm clock (4.2 BSD). */
SIGPROF27/* Profiling alarm clock (4.2 BSD). */
SIGWINCH28/* Window size change (4.3 BSD, Sun). */
SIGPOLLSIGIO/* Pollable event occurred (System V). */
SIGIO29/* I/O now possible (4.2 BSD). */
SIGPWR30/* Power failure restart (System V). */
SIGSYS31/* Bad system call. */
SIGUNUSED31

2.信号使用

signals函数

#include <QCoreApplication>
#include <signal.h>
#include <QDebug>

void Signals_Handle(int signal)
{
    qDebug()<<"recive signals:"<<signal;
}

int main(int argc, char *argv[])
{    
	/*注册信号*/
    signal(SIGINT,Signals_Handle);

    return 0;
}

当按下键盘ctrl+c以后捕捉到SIGINT信号

在这里插入图片描述
sigaction函数使用

void Signals_Handle(int signal)
{
    qDebug()<<"recive signals:"<<signal;
}

int main(int argc, char *argv[])
{
    int mySig = 10;

    struct sigaction siga;
    siga.sa_handler = Signals_Handle;
    siga.sa_flags = 0;
    memset(&siga.sa_mask, 0, sizeof(sigset_t));
    sigaction(SIGSEGV, &siga, NULL);  /*注册非法错误的信号*/
    sigaction(mySig, &siga, NULL);  /*注册自定义信号*/

    raise(mySig); /*发送自定义信号*/


    return 0;
}

按下ctrl+c可以看到结果
在这里插入图片描述
本人理解水平有限,更多细节可以查看man手册。如有不当请帮忙指出,也欢迎大家一起交流技术。

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值