APUE 中文第二版中 10.13节程序10-11 中的分析

   最近看到这一节,关于如下段落说明十分不理解:

“在睡眠期间如果产生了退出信号,那么此时该信号是未决的,但是不再受阻塞,所以在
s i g p r o c m a s k返回之前,它被递送到本进程。从程序的输出中可以看到这一点: S I G Q U I T处理
程序(s i g _ q u i t)中的p r i n t f语句先执行,然后再执行s i g p r o c m a s k之后的p r i n t f语句。”

 

 想了很久不知道什么意思,现记录下分析结果。(全是自己猜想的)

1、“在睡眠期间如果产生了退出信号,那么此时该信号是未决的,但是不再受阻塞” 是否是 sleep()造成的 “信号是未决的,但是不再受阻塞”?

2、“该信号是未决的,但是不再受阻塞,所以在 s i g p r o c m a s k返回之前,它被递送到本进程。” 分别又是什么意思?

 

问题1:

sleep()是绝对不会造成这种现象的。

“Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.”

大致意思是2种情况:一是睡眠时间到了 ;二是被一个信号处理程序中断,返回还没有睡眠完的时间。

文中的意思应该是:“在调用sleep产生休眠的这段时间内,产生了一个信号,那么此时该信号是未决的,但是不再受阻塞。

问题二:

当时第一印象是 ,怎么不阻塞,是不是写错了?

当时第一印象是 ,怎么不阻塞,是不是写错了?

sigprocmask就是设置当前的信号屏蔽集的,程序中取消了对SIGQUIT信号的屏蔽。“在调用sigprocmask后,如果有任何未决的,不再阻塞的的信号,则在sigprocmask返回前,至少回将其中一个信号递送给该进程。”

 

原文应该是理解如下:

当在睡眠期间收到一个SIGQUIT信号时,系统发现该信号是一个阻塞信号,于是递送阻塞。直到调用sigprocmask,此时当前信号是未决状态的(递送阻塞造成的),但是sigprocmask又将SIGQUIT设置为非阻塞的。于是在sigprocmask返回前递送SIGQUIT。

在调用sleep产生休眠的这段时间内,产生了一个信号,那么此时该信号是未决的,但是不再受阻塞。”中的“此时”应该指调用sigprocmask设置SIGQUIT为非阻塞那个时刻,而非信号的产生时刻。

 

额 是这个结果吗?

 

似乎信号从产生到递送 不是当前进程的任务。但是信号处理程序的执行一定是当前进程。

你可能感兴趣的:(c,任务,Signal)