免费注册 查看新帖 |

Chinaunix

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

搞不懂apue中关于信号那一章的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-06 13:17 |只看该作者 |倒序浏览
关于早期系统处理中断信号的程序有疑问,这个程序看起来是递归调用,而且没有结束的条件.为什么能执行?请知道的给我解释一下.代码如下:
int sig_int_flag;//set nonzero when signal occurs
main()
{
int sig_int();//my singal handling function
...
signal(SIGINT,sig_int);//establish   handler
...
while(sig_int_flag==0)
    pause();   //go to sleep,waiting for signal
...
}

sig_int()
{
signal(SIGINT,sig_int);//reestablish  handler for next time
sig_int_flg=1;//set flag for main loop to examine
}

论坛徽章:
0
2 [报告]
发表于 2007-06-06 13:22 |只看该作者
哪儿是递归的?你想怎么结束?

论坛徽章:
0
3 [报告]
发表于 2007-06-06 13:25 |只看该作者
原帖由 from2005on 于 2007-6-6 13:17 发表于 1楼  
关于早期系统处理中断信号的程序有疑问,这个程序看起来是递归调用,而且没有结束的条件.为什么能执行?请知道的给我解释一下.代码如下:
int sig_int_flag;//set nonzero when signal occurs
main()
{
int sig ...



最开始sig_int_flag = 0; 然后进入到while()循环, 此时因为其为0, 所以执行pause(); 而停在那个地方
当有信号时, sig_int_flag 为1了. 此时又执行while()判断, 而此时不满足这个条件, 故退出while()循环.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-06-06 13:27 |只看该作者
原帖由 from2005on 于 2007-6-6 13:17 发表于 1楼  
关于早期系统处理中断信号的程序有疑问,这个程序看起来是递归调用,而且没有结束的条件.为什么能执行?请知道的给我解释一下.代码如下:
int sig_int_flag;//set nonzero when signal occurs
main()
{
int sig ...

仔细看书。

另外,如果对书中的代码有疑问,请指明是哪一版本、哪段代码。

论坛徽章:
0
5 [报告]
发表于 2007-06-06 23:21 |只看该作者
sig_int()
{
signal(SIGINT,sig_int);//reestablish  handler for next time
sig_int_flg=1;//set flag for main loop to examine
}

sig_int()这个信号处理函数在执行时调用了signal(SIGINT,sig_int);这不就又调用了sig_int了么?
我是初学者,搞不懂这个调用什么时候停止啊?
另外说明:书中也是只是说早期的unix系统有这样的代码,具体哪个版本书中也没有提到.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2007-06-06 23:48 |只看该作者
原帖由 from2005on 于 2007-6-6 23:21 发表于 5楼  
sig_int()
{
signal(SIGINT,sig_int);//reestablish  handler for next time
sig_int_flg=1;//set flag for main loop to examine
}

sig_int()这个信号处理函数在执行时调用了signal(SIGINT,sig_int);这不就又调用了sig_int了么?

怎么个“这不就又”法?难不成在 signal 中又调用了 sig_int?
另外说明:书中也是只是说早期的unix系统有这样的代码,具体哪个版本书中也没有提到.

我说的版本指的是书的版本。

论坛徽章:
0
7 [报告]
发表于 2007-06-07 00:22 |只看该作者
书是第2版.
那signal 中又调用了是哪个处理函数?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2007-06-07 00:58 |只看该作者
原帖由 from2005on 于 2007-6-7 00:22 发表于 7楼  
书是第2版.
那signal 中又调用了是哪个处理函数?

仔细看书吧,书上对这个问题讲的已经很清楚了。或者你应该更清晰准确的描述你的疑惑。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2007-06-07 01:01 |只看该作者
原帖由 from2005on 于 2007-6-6 23:21 发表于 5楼  
sig_int()
{
signal(SIGINT,sig_int);//reestablish  handler for next time
sig_int_flg=1;//set flag for main loop to examine
}

sig_int()这个信号处理函数在执行时调用了signal(SIGINT,sig_int);这 ...

让我猜猜:楼主清楚 signal 是做什么的么?清楚作为参数传给 signal 的函数(指针) sig_int 在什么时候调用么?

[ 本帖最后由 MMMIX 于 2007-6-7 01:07 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-06-07 09:01 |只看该作者
原帖由 from2005on 于 2007-6-6 23:21 发表于 5楼  
sig_int()
{
signal(SIGINT,sig_int);//reestablish  handler for next time
sig_int_flg=1;//set flag for main loop to examine
}

sig_int()这个信号处理函数在执行时调用了signal(SIGINT,sig_int);这 ...



它只是去注册了一个函数而已.
记得在哪儿看过, 其实注册一个信号处理函数相当于是两个进程, 一个进程正常运行, 一个进程在查看有无信号发生. 如果有, 则让第一个进程停止而执行开始注册的那个函数.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP