十_信号1-signal(),信号会打断阻塞的系统调用

查看信号

mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ kill -l

在这里插入图片描述 0 - 31 : 标准信号
32 - 64:实时信号

在这里插入图片描述
这种写法就是这样:其中返回值 和 参数列表要区分开看
最外层的 void * xxx (int) 代表的就是 signal函数的返回值类型 – 参数为int 返回值为void*的函数指针

而 中间的 signal(int signo , void (*func)(int)) 则是函数本体,它的参数 int以及一个函数指针

在这里插入图片描述

signal()将信号符号的配置设置为handler, handler可以是SIG_IGN、SIG_DFL,也可以是程序员定义的函数(“信号处理器”)的地址。

SIG_IGN:向内核表示忽略此信号
SIG_DFL:向内核表示接到此信息的动作是系统默认动作
当指定函数地址的时候,则在信号发生时,调用该函数,即调用信号处理函数。

信号 SIGINT 指的是 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实验1:忽略 SIG_IGN信号

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

int main()
{
	int i;

	signal(SIGINT,SIG_IGN);

	for(i=0 ; i<12 ; i++)
	{
		write(1,"*",1);
		sleep(1);
	}

	exit(0);
}



mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ gcc test.c 
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ./a.out 
***^C*^C^C^C*^C^C***^C^C^C**^C^C*^C^C^C*mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ 
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ 
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ 

可以看到 程序运行中 不会收到 Ctrl-C 影响

实验2:响应SIG_IGN信号

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

void sig_handler(int s)
{
	write(1,"!",1);
}

int main()
{
	int i;

	signal(SIGINT,sig_handler);

	for(i=0 ; i<12 ; i++)
	{
		write(1,"*",1);
		sleep(1);
	}

	exit(0);
}

mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ gcc test.c 
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ./a.out 
*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!**^C!*^C!mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ^C
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ 

信号会打断阻塞的系统调用

实验3:信号会打断阻塞的系统调用

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

void sig_handler(int s)
{
	write(1,"!",1);
}

int main()
{
	int i;

	signal(SIGINT,sig_handler);

	for(i=0 ; i<12 ; i++)
	{
		write(1,"*",1);
		sleep(1);
	}

	exit(0);
}

mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ./a.out 
*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!*^C!mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ^C
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ^C
mhr@ubuntu:~/Desktop/xitongbiancheng/parallel/signal$ ^C

如果执行过程中 一直按住 Ctrl-C ,那么程序会很快结束,用不到15秒。

这是因为 信号会打断阻塞的系统调用。

如:open() 中也有说明

EINTR While blocked waiting to complete an open of a slow device (e.g., a FIFO; see fifo(7)), the call was interrupted by a signal handler; see signal(7).

当阻塞的等待 打开一个比较慢地方设备的时候,这个调用有可能被信号打断。
如 正在打开一个设备,这个设备可能比较慢,或者这个设备正忙,open()在打开它的时候需要消耗一点时间,即 open()会阻塞,这时候如果有信号 则会打断正在阻塞的系统调用。

如 read() 中也有说明

EINTR The call was interrupted by a signal before any data was read; see signal(7)
在我读到任何内容之前,如果有信号,将会被打断。即信号会打断阻塞的系统调用。

所以之前的程序 ,如 open() , read() 需要加阻塞出错的判断:
在这里插入图片描述
在这里插入图片描述

系统调用执行中不会被打断,而是等待,阻塞中会被打断。如等待打开,等待读取。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值