Linux SIGINT捕获

test.c

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

void int_handler(void);

int main(int argc, char ** argv)
{
    sigset( SIGINT, int_handler);
    printf( "Process_pid=[%d]\n", getpid() );
    while(1);
    return 0;
}

void int_handler(void)
{
    printf("Get a SIGINT signal!\n"); 
}

SIGINT: 程序中止信号,在用户键入INTR字符(通常是Ctrl+C)时发出。

gcc  test.c -o test

运行程序:

./test

按下Ctrl+C键(or kill -2 1234,kill -SIGINT 1234),程序并不退出,而是打印输出 Get a SIGINT signal!。
可以使用Ctrl+\ 来退出(SIGQUIT)。
//
signal函数

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。  
第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:
(1)SIG_IGN   
这个符号表示忽略该信号。

#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[]) 
{
    signal(SIGINT, SIG_IGN);
    while(1);
    return 0;
}

按下Ctrl+C,由于信号忽略了,程序并不退出。
(2)SIG_DFL   
这个符号表示恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作。

#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[])
 {
    signal(SIGINT, SIG_DFL);
    while(1);
    return 0;
}

这时就可以按下CTRL +C 来终止该进程了。把signal(SIGINT, SIG_DFL);这句去掉,效果是一样的
(3)sighandler_t类型的函数指针

如上。
//

   kill - send a signal to a process

EXAMPLES
kill -9 -1
Kill all processes you can kill.

   kill -l 11
          Translate number 11 into a signal name.

   kill -L //kill -l ???
          List the available signal choices in a nice table.

   kill 123 543 2341 3453
          Send the default signal, SIGTERM, to all those processes.

发送信号SIGTERM给进程 4589,方法:
kill -s TERM 4589
kill -s 15 4589
kill -n TERM 4589
kill -n 15 4589
kill -15 4589 //建议
kill -TERM 4589 //建议
kill -SIGTERM 4589

在进程中,SIGTSTP(信号量20: Ctrl+Z)和SIGKILL(信号量9)信号是不可以被捕获或者忽略的。除此之外,其他的各种信号都可以被进程捕获和处理。


ps -aux
ps -ef
ps -ef | grep test
通过名字杀死进程:

killall test
pkill test
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill只要给出进程名的一部分就可以终止进程。
pkill tes :ok
killall tes :error

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值