免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5622 | 回复: 23
打印 上一主题 下一主题

这个问题很难(进程组间通信问题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-16 17:19 |只看该作者 |正序浏览
主线程创建三个子线程:thread1,thread2,thread3
这三个子线程里面均处理SIGTERM信号,在接收到此信号时让全局变量tmp++
然后再主线程里面调用kill(getpid(),SIGTERM)向当前进程发送SIGTERM信号
为什么只有第一个线程thread1能收到信号,其他两个线程收不到信号?

论坛徽章:
0
24 [报告]
发表于 2008-01-23 22:56 |只看该作者
可以参考一下《情景分析》中的724页

论坛徽章:
0
23 [报告]
发表于 2008-01-23 22:45 |只看该作者

回复 #22 chenhj_wo 的帖子

信号其实可以看作软件层次上对中断的模拟,因此可以按照中断的方式去理解它。我记得看赵炯的“linux0.11内核详解”的时候好像在从内核空间返回用户空间的时候会检测是否有改进程的信号产生,有的话就响应,具体的我也记不太清了。我觉得你这个程序之所以只有一个线程响应了就是因为你只是发送了一个这样的信号。具体的你可以看看有关源码啊。

论坛徽章:
0
22 [报告]
发表于 2008-01-23 20:23 |只看该作者
这类问题以我现在的水平我是看不懂啦!
不过我想向各位大虾请教一下,想学习Linux更深入的东西(比如本贴讨论的内容),
应该看哪些书呢?如果哪位大虾有电子书共享出来那就更好了,小弟不胜感激.没有
电子书的话,列出书名,小弟同样不胜感激.

论坛徽章:
0
21 [报告]
发表于 2008-01-23 15:35 |只看该作者
首先,那个32位的变量叫做信号掩码(sig_mask),但是不一定是32位,它是用来阻塞信号的
如果某个信号在sig_mask中被置1,则信号到来时候将其阻塞

其次,我感觉你的解释不怎么详细,应该说得更详细:wink:

论坛徽章:
0
20 [报告]
发表于 2008-01-22 17:06 |只看该作者

回复 #19 cxchao_cs 的帖子

每一个进程都有一个32位的变量来描述他所拥有的信号,每个信号一位,如果信号到来的话就会置该位为1,进程在某个时刻会检查是否有信号到来,有的话就去执行,然后清零该位,等待信号的再次到来。

论坛徽章:
0
19 [报告]
发表于 2008-01-22 16:57 |只看该作者
首先,我不明白你这句话是啥意思
“处理结束后会把该信号的标志位清零”,这里的标志位是哪个标志位

另外,是第一个线程响应了信号,而不是最后一个

论坛徽章:
0
18 [报告]
发表于 2008-01-21 16:57 |只看该作者

回复 #17 flw2 的帖子

是不是因为这个原因啊。
Linux中线程和他的父进程是共用信号的,因此在程序执行到某个地方的时候如果信号到了就会去执行他的处理函数,处理结束后会把该信号的标志位清零。所以一个进程的信号,在信号到来时只能执行一次该信号的处理函数,具体到楼主的程序,我觉得执行的函数应该是最后一个被注册的线程的处理函数,因为会覆盖前面两个线程的设置。
自己理解的不知对不对^_^

论坛徽章:
0
17 [报告]
发表于 2008-01-21 11:28 |只看该作者
变量只被加了1次,就说明最多1次,这是公理,不是证明,而是验证

论坛徽章:
0
16 [报告]
发表于 2008-01-21 11:02 |只看该作者
还有一个问题,怎样才能证明“最多一个收到”?:wink:
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP