signal简述

一个几乎是最简单的应用如下:

#include <unistd.h>  // for alarm()

#include <signal.h>  // for signal()

#include <stdio.h>   // for printf()



void do_alarm(int sig)

{

    printf("do alarm.\n");

    alarm(1);    // restart alarm

}



int main()

{

    signal(SIGALRM, do_alarm);    // register signal handler

    alarm(1);    // start alarm

    while(1);    // loop forever

}

这个应用可以通过Ctrl+C结束。下面这个应用拦截Ctrl+C和Ctrl+Q:

#include <signal.h>  // for signal()

#include <stdio.h>   // for printf()



void do_sig_exit(int sig)

{

    printf("SIGINT or SIGQUIT received.\n");

}



int main()

{

    signal(SIGINT, do_sig_exit);

    signal(SIGQUIT, do_sig_exit);

    while(1);    // loop forever

}

以上程序可以使用kill -9终止。

可中断系统调用总是会被中断,不管你是否安装了signal处理函数。

一般来说signal是不会累计的(?有例外否?)。以上面的代码为例,如果在执行do_sig_exit前产生了多次SIGINT,do_sig_exit仅执行一次。已产生的signal在进入信号处理函数时清除,如果在do_sig_exit左括号后产生了新的SIGINT,do_sig_exit会在返回后再次执行。

你可能感兴趣的:(Signal)