linux中signal函数的简单用法

信号是软件中断,它提供了一种处理异步事件的方法,每个信号有个以SIG打头的名字,讲signal函数之前我们先了解下当前系统所支持的信号名称,在linux中敲下kill -l就能查看。

[lingyun@localhost file]$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
kill默认发送SIGTERM的信号,若其被signal捕捉,那我们也不慌,记住一招,kill -9 加进程号或者是killall -9 加进程名发送SIGKILL的信号,任何程序都会被秒杀。


[lingyun@localhost file]$ ps aux | grep a.out
lingyun  11414  0.0  0.0  22596   412 ?        Ssl  Jan31   0:01 ./a.out
lingyun  12091  0.0  0.0  22596   412 ?        Ssl  00:19   0:00 ./a.out
lingyun  13364  0.0  0.0   6056   820 pts/1    S+   04:32   0:00 grep a.out
[lingyun@localhost file]$ kill -9 11414
[lingyun@localhost file]$ ps aux | grep a.out
lingyun  12091  0.0  0.0  22596   412 ?        Ssl  00:19   0:01 ./a.out
lingyun  13366  0.0  0.0   6056   796 pts/1    S+   04:33   0:00 grep a.out
[lingyun@localhost file]$ killall -9 a.out
[lingyun@localhost file]$ ps aux | grep a.out
lingyun  13369  0.0  0.0   6052   784 pts/1    S+   04:33   0:00 grep a.out

给大家看一个特别简单的signal函数的调用,在看程序之前,咱们先要知道键盘上的ctrl加c对操作系统发送的是SIGINT的信号,我们试图去 捕捉这个信号,然后再干其他的事情。
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int     g_alarm = 0;
void sig_catch(int signum) 
{  
    printf("Catch signal [%d]\n", signum);  //捕捉到SIGINT后打印这个
    return;
}
int main(int argc,char *argv[])
{
    printf("program %s start running\n",argv[0]);  //打印第一个参数
    signal(SIGINT, sig_catch);     //捕捉SIGINT的信号函数
    alarm(10);      //闹钟,十秒后程序自动退出
    while(1);
    {
        sleep(10);
    }
}
接着我们看执行结果,在执行的时候咱们试着多次按ctrl加c试图结束程序,可它就像个病毒一样,停不下来, 只有等待闹钟的 十秒钟结束,它才会静静自行安息。
[lingyun@localhost file]$ gcc signal.c          
[lingyun@localhost file]$ ./a.out               
program ./a.out start running
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
^CCatch signal [2]
闹钟






  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜亚轲

你花钱的样子真帅

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值