免费注册 查看新帖 |

Chinaunix

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

select函数、so文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-26 17:32 |只看该作者 |倒序浏览
while (!stop)
{
                FD_SET(STDIN_FILENO, &readset);
                FD_SET(devstat.fd, &readset);
                if ( (select(devstat.fd+1, &readset, &writeset, NULL, &tv) <=0))
                {
                        //异常中断或者超时
                        stop = 1;
                        continue;
                }
                if (FD_ISSET(devstat.fd, &readset))
                {
                        res = read(devstat.fd, buf, sizeof(buf));
                        len = len+res;
                        if(res <=0)
                        {
                                break;
                        }
                        memcpy(p, buf, res);
                        p=p+res;
                }
}       


这是一个读Modem发短信的程序中的一段。
我将这个功能做成一个服务在Linux上运行没有问题。
可是我将这个功能做成了一个so文件供其它模块调用的是时候出现这样一个问题:我在启动我们的整个服务的时候,当前控制台(启动服务的窗口,比如打开的一个secureCRT窗口)不关闭,没有问题,一旦控制台关闭了,就有问题,我跟踪了整个程序,发现是在上面这段程序出现问题了,在窗口被关闭后,这个while循环不停的运行下去,没有停止;而没有关闭的话会在几个while循环后在select处跳出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
2 [报告]
发表于 2007-04-26 18:14 |只看该作者
原帖由 rfuture 于 2007-4-26 17:32 发表于 1楼  
当前控制台(启动服务的窗口,比如打开的一个secureCRT窗口)不关闭,没有问题,一旦控制台关闭了,就有问题,我跟踪了整个程序,发现是在上面这段程序出现问题了,在窗口被关闭后,这个while循环不停的运行下去,没有停止;而没有关闭的话会在几个while循环后在select处跳出 while了。

当断开终端时,所有从此终端启动的程序(不包括服务)都会收到 SIGHUP 信号,可以从这方面着手查下。参考 nohup(1) 及 APUE2 相关章节。

论坛徽章:
0
3 [报告]
发表于 2007-04-27 09:10 |只看该作者
但是如果这段程序不是做在so文件中,而是在一个单独的服务,我关闭了终端就可以的。

论坛徽章:
0
4 [报告]
发表于 2007-04-27 16:06 |只看该作者
FD_SET(STDIN_FILENO, &readset);  《--- 这行是干吗的?
在每次select前要
FD_ZERO(&readset)
还要重新对tv初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP