信号是一种软件中断,也是进程间唯一的异步通信方式。信号可通过硬件发送,如键入CTRL+C,或者程序发送。软件可通过signal函数捕捉信号,针对信号编写信号处理函数,进行异步操作。
    在终端可用kill命令发送信号。信号有优先级,高优先级的首先处理。
    1、signal(int signum,void (*f)(int))
    第一个参数为需要处理的信号,第二个参数为信号处理函数的指针。函数要求必须含一个int参数和返回void。

    1. #include "signal.h"
    2. void sig_process(int sig_no){
    3. printf("signal has been received\n");
    4. }
    5. int main(int argc,char* argv[])
    6. {
    7. signal(SIGINT,sig_process);
    8. while(1);
    9. return 0;
    10. }

    2、int sigaction(int signum,const struct sigaction act ,struct sigaction oldact);
    sigaction用来设置信号处理方式。第一参数为处理信号,act是一个记录行为的结构体。主要设置响应函数和是否嵌套响应等信息。

    int main(int argc,char* argv[])
    {
    
        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();
    调用后进程处于挂起状态,直到进程接收到任意信号才继续运行。可用于同步进程:先设置信号的处理函数,再挂起进程。其他进程的工作完成后向挂起的进程发送特定信号,挂起进程继续工作。