执行“sl”命令会出现一个“跑火车”的程序,用以惩罚把“ls”写错的用户。
那它是怎么屏蔽 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);
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;
}
#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
^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;
}
#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.
^Cnot allowed.
^Cnot allowed.
^Cnot allowed.