程序中如何屏蔽 Ctrl-C (SIGINT) 信号?

执行“sl”命令会出现一个“跑火车”的程序,用以惩罚把“ls”写错的用户。


烦人的地方在于,按 Ctrl-C 是无法退出这个程序的。

那它是怎么屏蔽 SIGINT 信号的? 比想象中简单,就一行。

// file: sl.c
int main(int argc, char *argv[])
{
    int x, i;

    for (i = 1; i < argc; ++i) {
        if (*argv[i] == '-') {
            option(argv[i] + 1);
        }
    }
    initscr();
    signal(SIGINT, SIG_IGN); //<-----
    noecho();
    curs_set(0);

在自己的程序中,也可以加入 signal() 这一行来屏蔽信号,例如

#include <signal.h>
#include <stdio.h>

int main()
{
    signal(SIGINT, SIG_IGN);
    while(1);
    return 0;
}

测试:

[root@build ~]# ./test
^C^C^C^C^C^C^C^C^C^C^C

也可以指定一个 Handler 函数,改变接收到信号的行为,例如

#include <signal.h>
#include <stdio.h>

void print_greeting(int x){
    printf("not allowed.\n");
}

int main()
{
    signal(SIGINT, print_greeting);
    while(1);
    return 0;
}
[root@build ~]# ./test
^Cnot allowed.
^Cnot allowed.
^Cnot allowed.