首页 > 技术文章 > signal简述

byeyear 2013-09-06 19:21 原文

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

#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会在返回后再次执行。

推荐阅读