| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1164 人关注过本帖
标题:求教关于信号, 可重入函数(reentrant function)的问题,内付具体一小例
取消只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
已结贴  问题点数:50 回复次数:3 
求教关于信号, 可重入函数(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
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
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
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
快速回复:求教关于信号, 可重入函数(reentrant function)的问题,内付具体一 ...
数据加载中...
 
   



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

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