标题:求教关于信号, 可重入函数(reentrant function)的问题,内付具体一小例
只看楼主
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
已结贴  问题点数:50 回复次数:9 
求教关于信号, 可重入函数(reentrant function)的问题,内付具体一小例

这是一个关于信号, 可重入函数的程序,alarm() 函数每秒放出一个信号,

进入signal handler ,打印被赋值的结构体, 然后继续重复这个过程, 程序如下,问题在下面

#include <signal.h>
#include <stdio.h>

struct two_int {
        int a, b;
} data;

void signal_handler(int signum){

       printf ("%d, %d\n", data.a, data.b);

       alarm (1);
}

int main (void){

        static struct two_int zeros = { 0, 0 }, ones = { 1, 1 };

        signal (SIGALRM, signal_handler);

        data = zeros;

        alarm (1);

        while (1) {
               
                data = zeros;
               
                data = ones;
        }
}


这段代码好像和 可重入 函数有关系
它的打印结果并不是预料的
0,0
1,1
0,0
1,1

而是类似于
0, 0
1, 0
1, 0
1, 1
0, 0
1, 0
0, 1

据我了解,一般机器上比如给data 赋值,会有好几条汇编指令,所以,如果信号从中插一脚,alarm()每秒放一个信号出来

就让程序开始执行信号处理程序,返回后却找不到从哪里开始执行了???之后程序又从哪里开始执行?

比如信号在 data = zeros  这条语句执行过程中发生, 然后执行信号处理程序,信号处理程序结束后,又开始从哪里执行? 难道从 data = ones  开始??

我只能大概体会一下,但用上面的例子,有哪位可以帮忙稍微具体,细节一些说明一下,先谢过!


[ 本帖最后由 madfrogme 于 2012-10-9 17:38 编辑 ]
搜索更多相关主题的帖子: 结构体 include function 信号 
2012-10-09 16:21
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
而是类似于
0, 0
1, 0
1, 0
1, 1
0, 0
1, 0
0, 1

这是正常的啊 是个随机的情况 因为1s之后到底data是哪个谁也不知道
2012-10-09 16:50
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
得分:0 
回复 2楼 zklhp
恩,我就是想 要是能结合上面的代码说一下这个随机的具体是指什么就更好了

如果一个赋值被打断,那signal handler打印的是哪个date?

[ 本帖最后由 madfrogme 于 2012-10-9 18:03 编辑 ]

The quieter you become, the more you can hear
2012-10-09 17:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:45 
你这里一个赋值也就是4条指令

伪代码的话就是

mov eax, zeros.a
mov data.a, eax
mov eax, zeros.b
mov data.b, eax

mov eax, ones.a
mov data.a, eax
mov eax, ones.b
mov data.b, eax

所以就会打在这8条的间隙

个人见解 仅供参考

最近得分好少啊 楼主看着办
2012-10-09 17:28
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:5 
在data赋值的时候嵌入汇编,关闭中断,使得赋值操作为一个原子操作?这样试试看是什么效果。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-10-10 06:44
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
得分:0 
谢谢了

The quieter you become, the more you can hear
2012-10-10 08:57
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用pauljames在2012-10-10 06:44:32的发言:

在data赋值的时候嵌入汇编,关闭中断,使得赋值操作为一个原子操作?这样试试看是什么效果。

最简单的方法是 开优化用sse 这样的话一个结构体赋值可以在一次完成 也就是对于32/64位环境一次移动m64/m128的东西

不过不知道编译器会不会这么优化
2012-10-10 09:02
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
得分:0 
我本来是想要一些关于可重入函数和不可重入函数的建议,貌似一下子弄到原子操作上了

The quieter you become, the more you can hear
2012-10-10 09:37
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用madfrogme在2012-10-10 09:37:37的发言:

我本来是想要一些关于可重入函数和不可重入函数的建议,貌似一下子弄到原子操作上了

不知道可重入到底是个啥 不过感觉你这个如果要实现要么用我上面说的指令技巧 要么就用原子操作 同步一类的东东

不过貌似C本身不支持这个 所以得靠操作系统的接口罢
2012-10-10 09:55
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
6.52 Built-in functions for memory model aware atomic operations

貌似gcc手册里面说了关于这个的东西 内部函数 不过好复杂啊。。


2012-10-10 12:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-382773-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067700 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved