每个线程都有自己的信号屏蔽字,但是信号的处理时进程中所有线程共享的http://bbs.csdn.net/topics/350222437

来源:互联网 发布:达芬奇调色软件12.5 编辑:程序博客网 时间:2024/06/04 18:23
    新手小白看《unix环境高级编程》  有点困惑
      一个进程不是只有一个信号屏蔽字吗?一个进程可以创建多个线程,那么多个线程共享一个信号屏蔽字呀,为什么书上12.8节里说“每个线程都有自己的信号屏蔽字,但是信号的处理时进程中所有线程共享的”???
      还有啊,“sigprocmaskde 的行为在多线程的进程中并没有定义”,这样说的话,创建了线程就会使这个函数失去定义?还是包含了“pthread.h”就会使他失去定义?
      向大家请教了。感觉这类的问题没人问很难想到到,知道了就觉得很好理解似的,小弟自学呀,从第一章开始已经到十二章了(^-^ 太偏的跳过去)。。。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:11
#1 得分:10回复于: 2010-12-14 14:04:15
创建线程的时候,线程继承了进程的信号屏蔽字,但是线程也可以使用pthread_sigmask 修改自己的屏蔽字
“sigprocmaskde 的行为在多线程的进程中并没有定义”,应该不是说没有定义吧,而是说行为是不确定的。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#2 得分:4回复于: 2010-12-14 15:15:30
1楼解释的正确,楼主的未定义理解有偏差,是指在多线程环境中调用sigprocmask函数时函数的行为未给出标准定义,一般这么说就是调用时行为不确定,不同的实现也可能不同,都不一定是你想要达的效果。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#3 得分:0回复于: 2010-12-14 16:05:30
引用 1 楼 justkk 的回复:
创建线程的时候,线程继承了进程的信号屏蔽字,但是线程也可以使用pthread_sigmask 修改自己的屏蔽字
“sigprocmaskde 的行为在多线程的进程中并没有定义”,应该不是说没有定义吧,而是说行为是不确定的。
     
    那句话“sigprocmaskde 的行为在多线程的进程中并没有定义”是书上原话,是不是译者翻译的不够精确?
     一楼的意思是说  线程的屏蔽字从进程那获取
     那么什么时候多线程环境?是不是只要创建了线程,就是多线程环境?
     还有 在获取之后  进程屏蔽字的改变影响线程的屏蔽字吗?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#4 得分:2回复于: 2010-12-14 16:19:20
英文版本的原话是“The behavior of sigprocmask is undefined in a multithreaded process. Threads have to use pthread_sigmask instead”
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#5 得分:0回复于: 2010-12-14 17:27:52
第十二章是不是一个博士生翻译的?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#6 得分:4回复于: 2010-12-14 18:04:31
多线程需要使用pthread_sigmask
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_sigmask.html
引用 4 楼 justkk 的回复:
英文版本的原话是“The behavior of sigprocmask is undefined in a multithreaded process. Threads have to use pthread_sigmask instead”
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#7 得分:0回复于: 2010-12-15 13:39:43
引用 6 楼 mymtom 的回复:
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_sigmask.html


这个牛逼啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#8 得分:0回复于: 2010-12-15 13:42:33
mymtom说是这个网站怎么个用法啊
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_sigmask.html

譬如说我要查个函数,怎么在这个网站搜
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#9 得分:0回复于: 2010-12-15 15:01:31
  结贴了 第一次发帖 所以给一楼10分哈
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#10 得分:0回复于: 2011-11-29 11:21:56
都没回答到重点,我回答一下楼主真正想问的吧,虽然已经结贴一年了。

楼主主要问得问题是:“每个线程都有自己的信号屏蔽字,但是信号的处理时进程中所有线程共享的”???

我的回答:每个信号生命周期有三个阶段:1.generation产生 2.pending未决 3.delivery递送。
具体过程是,
内核-->产生(generation)信号----->pending(未决)------->递送(delivery)到进程/线程。
“每个线程都有自己的信号屏蔽字”,这句话说的是把信号阻止在pending状态,意思是信号根本就没有送到进程/线程,
“但是信号的处理时进程中所有线程共享的”这句话的意思是,信号送到进程/线程了,处于delivery状态,信号的处理动作在所有线程中共享,

看来楼主没弄明白,什么是信号屏蔽字,信号屏蔽字 不等于 信号动作block,一个是根本收不到信号;一个是受到了信号,然后阻塞。

我也是看了APUE,思考了一段时间才明白的,好书就是好书,这样的数得仔细反复看,经典啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#11 得分:0回复于: 2011-11-29 13:05:18
我上面说的"信号动作block","阻塞",不准确,应该改成“ignore”“忽略”
0 0
原创粉丝点击