阿凡提学linux程序设计100问(2),我百思不得其解,在线等待高手解答,谢谢!
来源: 互联网 发布时间:2015-07-29
本文导语: 关于第10章进程和信号的问题。 1,sigaction结构中的sa_mask是一组掩码,我的理解有如下几种,但互相矛盾,请告诉是真相是什么。 a,在调用sigaction函数之前,先把各种你想要阻塞的信号进行或运算,把得到的值放...
关于第10章进程和信号的问题。
1,sigaction结构中的sa_mask是一组掩码,我的理解有如下几种,但互相矛盾,请告诉是真相是什么。
a,在调用sigaction函数之前,先把各种你想要阻塞的信号进行或运算,把得到的值放到sigaction.sa_mask中,然后调用sigaction函数,这样在信号处理函数执行的过程中,如果出现了sa_mask中指定的信号,这些信号就被阻塞,不会发送到进程,处于待处理状态;
b,在调用sigaction函数之前,清空sigaction.sa_mask,然后调用sigaction函数,这样在信号处理函数执行的过程中,如果出现了其他的信号(不管这个信号是不是跟信号处理函数同名),都被放到sa_mask中,这样,等信号处理函数完成以后,我们再调用sigpending取得被阻塞的信号,依次对他们进行信号处理。
以上两个哪个是对的?我看书看迷糊了,百思不得其解,请高手指点。
2,一个信号出现在系统调用中,情况是不可以预料的;如果一个信号出现在一个函数调用中,引起了函数调用的中断,函数会返回一个错误,是吗?
3,信号如果引起了一个信号处理函数的中断,这个信号处理函数还可以在那个中断结束之后,会继续执行,是这样的吗?那为什么我上面2提到的函数在中断的时候就返回了错误呢?这个是普通函数和信号处理的函数的区别吗?
4,信号处理函数被中断以后,以后还会接着执行,这个特性叫做重入,重入是底层实现的,我们这部分不需要有特别注意的地方,是吗?
上面的问题弄得我乱七八糟,这块看不下去了,请高人指点,谢谢!谢谢!谢谢!谢谢!
1,sigaction结构中的sa_mask是一组掩码,我的理解有如下几种,但互相矛盾,请告诉是真相是什么。
a,在调用sigaction函数之前,先把各种你想要阻塞的信号进行或运算,把得到的值放到sigaction.sa_mask中,然后调用sigaction函数,这样在信号处理函数执行的过程中,如果出现了sa_mask中指定的信号,这些信号就被阻塞,不会发送到进程,处于待处理状态;
b,在调用sigaction函数之前,清空sigaction.sa_mask,然后调用sigaction函数,这样在信号处理函数执行的过程中,如果出现了其他的信号(不管这个信号是不是跟信号处理函数同名),都被放到sa_mask中,这样,等信号处理函数完成以后,我们再调用sigpending取得被阻塞的信号,依次对他们进行信号处理。
以上两个哪个是对的?我看书看迷糊了,百思不得其解,请高手指点。
2,一个信号出现在系统调用中,情况是不可以预料的;如果一个信号出现在一个函数调用中,引起了函数调用的中断,函数会返回一个错误,是吗?
3,信号如果引起了一个信号处理函数的中断,这个信号处理函数还可以在那个中断结束之后,会继续执行,是这样的吗?那为什么我上面2提到的函数在中断的时候就返回了错误呢?这个是普通函数和信号处理的函数的区别吗?
4,信号处理函数被中断以后,以后还会接着执行,这个特性叫做重入,重入是底层实现的,我们这部分不需要有特别注意的地方,是吗?
上面的问题弄得我乱七八糟,这块看不下去了,请高人指点,谢谢!谢谢!谢谢!谢谢!
|
1. 我想第一个是对的 —— 你还真能想的
2. 第二个我看不懂
2. 第二个我看不懂
|
1.掩码中的信号是否阻塞,由另外一个参数来决定,忘记是哪个了^_^,看看man
2.系统调用函数被中断时候都返回错误。
不可重入的函数返回错误后,可使用setjmp等函数实现重启。
3.自定义的信号处理函数是可重入的。你可以自己试试:
(在信号处理函数中加上sleep,再发送另外一个信号)。
4.并不是所有的系统调用都是可重入。比如malloc等就是不可重入的,
不可重入意思就是函数被中断后,不能继续执行原有指令队列。
而大部分的system call和普通函数都属于可重入的。
信号中断就像硬件的中断信号那样,进程会在中断发生时候,自动保存返回地址,
寄存器值等。然后在信号处理函数执行完了以后,恢复这些操作。
底层细节一般是不需要太关心。
2.系统调用函数被中断时候都返回错误。
不可重入的函数返回错误后,可使用setjmp等函数实现重启。
3.自定义的信号处理函数是可重入的。你可以自己试试:
(在信号处理函数中加上sleep,再发送另外一个信号)。
4.并不是所有的系统调用都是可重入。比如malloc等就是不可重入的,
不可重入意思就是函数被中断后,不能继续执行原有指令队列。
而大部分的system call和普通函数都属于可重入的。
信号中断就像硬件的中断信号那样,进程会在中断发生时候,自动保存返回地址,
寄存器值等。然后在信号处理函数执行完了以后,恢复这些操作。
底层细节一般是不需要太关心。
|
UP