[linux]信号的捕获和处理

信号是一种软件中断,也是进程间唯一的异步通信方式。信号可通过硬件发送,如键入CTRL+C,或者程序发送。软件可通过signal函数捕捉信号,针对信号编写信号处理函数,进行异步操作。

在终端可用kill命令发送信号。信号有优先级,高优先级的首先处理。

1、signal(int signum,void (*f)(int))

第一个参数为需要处理的信号,第二个参数为信号处理函数的指针。函数要求必须含一个int参数和返回void。

#include "signal.h"
void sig_process(int sig_no){
    printf("signal has been received
");
}

int main(int argc,char* argv[])
{
    signal(SIGINT,sig_process);
    while(1);
    return 0;
}

2、int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

sigaction用来设置信号处理方式。第一参数为处理信号,act是一个记录行为的结构体。主要设置响应函数和是否嵌套响应等信息。

int main(int argc,char* argv[])
{
    //signal(SIGINT,sig_process);
    struct sigaction act;
    act.sa_handler=sig_process;
    act.sa_flags=SA_NOMASK;//if set this,nesting(嵌套) is allowed.
    sigaction(SIGINT,&act,NULL);
    while(1);
    return 0;
}

3、int kill(pid_t pid,int sig);

参数分别是目标进程的pid和信号,成功返回0,失败返回-1.

使用sigqueue()也可以对目标进程发送信号,并发送数据

4、int alarm(int seconds);

调用函数seconds秒后,系统会向调用alarm函数的进程发送一个SIGALRMd的信号。函数settimer()也具有定时功能,其选项比alarm丰富。

5、setprocmask()用来设置进程的屏蔽信号集;sigpending()用来查看被阻塞和未决的信号集。

6、pause();

调用后进程处于挂起状态,直到进程接收到任意信号才继续运行。可用于同步进程:先设置信号的处理函数,再挂起进程。其他进程的工作完成后向挂起的进程发送特定信号,挂起进程继续工作。

原文地址:https://www.cnblogs.com/iyjhabc/p/3166590.html