当前位置:  技术问答>数据库 iis7站长之家

阿凡提学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. 我想第一个是对的 —— 你还真能想的

2. 第二个我看不懂

|
1.掩码中的信号是否阻塞,由另外一个参数来决定,忘记是哪个了^_^,看看man
2.系统调用函数被中断时候都返回错误。
  不可重入的函数返回错误后,可使用setjmp等函数实现重启。
3.自定义的信号处理函数是可重入的。你可以自己试试:
(在信号处理函数中加上sleep,再发送另外一个信号)。
4.并不是所有的系统调用都是可重入。比如malloc等就是不可重入的,
  不可重入意思就是函数被中断后,不能继续执行原有指令队列。
  而大部分的system call和普通函数都属于可重入的。

信号中断就像硬件的中断信号那样,进程会在中断发生时候,自动保存返回地址,
寄存器值等。然后在信号处理函数执行完了以后,恢复这些操作。
底层细节一般是不需要太关心。

|
UP

    
 
 

您可能感兴趣的文章:

  • 阿凡提学linux程序设计100问(1)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3