linux c语言 信号,linux信号解释(4)--C语言下的理解

上一节中中简单介绍了信号的处理机制,就是调用函数库来实现信号的处理,因此,在这节中,介绍在C语言下如何理解信号的处理机制。

创建一个文件signal.c,文件内容如下:(对于学过一下C语言的童鞋来说是不是很熟悉呢)

#include //信号函数库

#include //C和C++语言提供对POSIX

#include //标准的输入输出库

void signalout(int signo) //自定义signalout函数,用于处理signal函数的参数

{

switch(signo)

{

case 1: //信号1SIGHUP

printf("Get a signal -- SIGHUP\n");

break;

case 2: //信号SIGINT

printf("Get a signal -- SIGINT\n");

break;

case 3: //信号SIGQUIT

printf("Get a signal -- SIGQUIT\n");

break;

default:

printf("error\n");

break;

}

}

int main()

{

printf("process ID is %d\n",getpid()); //调用unistd.h函数库中的getpid函数获取当前进程ID

signal(1,signalout); //写法有两种,一种是写信号数字

signal(SIGINT,signalout); //另一种写法是写信号名称

signal(SIGQUIT,signalout); //调用前面自定义的signalout函数处理信号

for(;;); //写一个死循环,目的是使这个进程一直在运行,以便捕捉信号

return 0;

}

题外讲解,signal()函数:

函数原型:

void (signal(int signum,void( handler)(int)))(int) 或 typedef void (*sig_t)( int ) 或 sig_t signal(int signum,sig_t handler)

参数说明:

第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号

第二个参数handler描述了与信号关联的动作,它可以取以下三种值:

(1)一个无返回值的函数地址

此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:

void func(int sig);

(2)SIG_IGN

这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。

(3)SIG_DFL

这个符号表示恢复系统对信号的默认处理。

保存编辑的文件后执行#gcc signal.c -o signal,编译生成可执行二进制文件signal。(在这里我们就学习了如何在linux下进行C语言编写啦^_^)

ec381c1983abf024bb4edb6301674cce.png

接着我们运行二进制文件#./signal

96b819610bd28e8b1a26778b4c049673.png

在另外一个terminal中发送信号

764709a401cae55dfb15a41cf1ca72ae.png

40b5aece2c774550e5caba1b0678c53d.png

目前按ctrl+c是无法终止当前进程的了。想要终止进程只能通过SIGKILL信号来实现(因为之前说过SIGKILL和SIGSTOP信号是无法被捕捉的嘛)

#kill -9 22822

dd09c9c6e786c8087de4d38cf57eae97.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值