Linux入门:信号(一)——基本概念

信号是一种通知机制。一个信号就是一条小消息,它通知系统进程系统中发生了一个某种类型的事件。每种信号类型都对应于某种系统事件。低层的硬件异常是由内核异常处理程序处理的。正常情况下,对用户进程而言是不可见的,信号提供了一种机制,通知用户进程发生了这些异常。

传送一个信号到目的进程是由两个不同步骤组成的:

(1)发送信号。内核通过更新目的进程上下文中的某个状态,递送一个信号给目的进程(修改目标进程PCB中的某些字段)。

        发送信号可能会有两个原因:1)内核检测到一个系统事件,比如被零除或子进程终止

                                                    2)一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程

(2)接受信号:当目的进程被内核强迫以某种方式对信号的发送作出反应时,目的进程就接收了信号。

信号相对于进程的控制流程来说是异步的。


kill -l 命令可以查看Linux下的所有信号编号:


从第34到第64个信号为实时信号(一旦发起立即响应),第1个到第31个信号为普通信号。


产生信号的主要条件有:

(1)用户在终端按下某些键时,终端驱动程序会发送信号给前台进程(一般在命令行下启动的进程,一个命令后面可以加个&放到后台运行),例如Ctrl+\会产生SIGQUIT信号

(2)硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

(3)一个进程调用了kill函数可以发送信号给另一个进程。


信号的处理动作:

(1)忽略此信号

(2)执行信号的默认处理动作

(3)提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个函数,这种方式称为捕捉一个信号


产生信号:

A.通过终端按键产生信号

SIGINT(Ctrl+c)的默认动作是终止进程,SIGQUIT(Ctrl+\)的默认处理动作是终止进程并且core dump。

关于core dump:当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这称为core dump(核心转储)。进程异常终止通常是因为有bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做“事后调试”(Post-mortem Debug)。一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存在PCB中)。默认是不允许产生core文件的,因为core文件中可能会包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。




写一个死循环的函数,然后按下Ctrl+\(发送信号SIGQUIT),会产生一个core文件:


然后采用事后调试:



B.调用系统函数向进程发信号

int kill(int pid , int sig);

int raise(int signo);//进程向自己发送信号

void abort(void);//使当前进程接受到信号而终止(它总是会成功,所以没有返回值)

raise
void handler(int sig)
{
	printf("get a sig:%d\n", sig);
}

int main()
{
	signal(2, handler);
	raise(2);
}



C.由软件条件产生信号

SIGPIPE:向已关闭的管道中写数据(进程间通信)

unsigned int alarm(unsigned int seconds);

调用alarm函数告诉内核在second秒之后给当前进程发SIGALRM信号,该信号的默认处理动作是终止当前进程。返回值是上次闹钟剩余的秒数,要么就为0。

alarm

int count = 0;

void handler(int sig)
{
	printf("count:%d\n", count);
	exit(1);
}

int main()
{

	signal(SIGALRM, handler);
    alarm(1);

	//int count = 0;
	//int count = 0;
    while(1)
    {
    	//printf("count:%d\n", count);
    	count++;
    }
	return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值