为什么设制定时器在虚拟机中貌似不起作用,在物理机中却正常呢?

雷格 2012-12-23 10:29:42
同样的代码在虚拟机中没反应,我转到物理下试了一下,定时器定时发送信号触发处理函数。
虚拟机软件是virtual box,虚拟机和物理机都是ubuntu 12.04
在main.cpp中

//创建一个定时器,每隔一段时间更新用户状态
signal(SIGALRM,refreshClientStatus);

//定时器
struct itimerval timeinter;
timeinter.it_value.tv_sec=5;//初始时间
timeinter.it_value.tv_usec=0;
timeinter.it_interval.tv_sec=5;//间隔时间
timeinter.it_interval.tv_usec=0;
//开启定时器
setitimer(ITIMER_REAL,&timeinter,NULL);


处理函数的代码如下

void refreshClientStatus(int)
{
FILE*fp = fopen("info.txt","w");
fprintf(fp,"refreshClientStatus trigger.\n");
fclose(fp);
pclientinfomap->Refresh();
}
//.....
void ClientInfoMap::Refresh(void)
{
map<string,ClientInfo>::iterator it;
pthread_mutex_lock(&lock);//加锁
for(it=pmap->begin(); it!=pmap->end(); ++it)
{
if(-- ((it->second).status) == OFFLINE)
{
DeleteWithoutMux(it->first);//删除
}
}
cout<<"ClientInfoMap::Refresh被调用.\n";
pthread_mutex_unlock(&lock);//释放锁
}


在虚拟机下一直看不到信号处理函数打印出的字符串。
在物理机中却正常的。打印如下
chao@chao-ThinkPad-Edge:~/IMProgram/server$ ./server
waiting for the client...
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
^C
...全文
132 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
雷格 2012-12-23
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
你先得确认定时器是否被启动。你这段代码如果lock死锁了也会什么都不输出的。
可是同样的代码 在物理机上能看到正常的结果啊。在物理机上没死锁,在虚拟机上也不会吧。 再说我是先打印字符串再去获得锁的
FancyMouse 2012-12-23
  • 打赏
  • 举报
回复
你先得确认定时器是否被启动。你这段代码如果lock死锁了也会什么都不输出的。
雷格 2012-12-23
  • 打赏
  • 举报
回复
引用 4 楼 FancyMouse 的回复:
哦你有一句fprintf。但是那个不够。你有可能fprintf到缓冲区还没写入内存,接下来死锁了。你文件里还是看不到的。 加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
可是我的fprintf后面紧跟着一句 fclose(fp);有刷新缓冲区的效果,和fflush(fp)一样吧! 还有 在物理机下一切正常,printf和fprintf都能正确输出,说明没有死锁啊。难道同一份代码在虚拟机下死锁在物理机下却不会死锁?
FancyMouse 2012-12-23
  • 打赏
  • 举报
回复
>缓冲区还没写入内存 => 缓冲区还没写入文件
FancyMouse 2012-12-23
  • 打赏
  • 举报
回复
哦你有一句fprintf。但是那个不够。你有可能fprintf到缓冲区还没写入内存,接下来死锁了。你文件里还是看不到的。 加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
FancyMouse 2012-12-23
  • 打赏
  • 举报
回复
引用 2 楼 leigema 的回复:
引用 1 楼 FancyMouse 的回复:你先得确认定时器是否被启动。你这段代码如果lock死锁了也会什么都不输出的。 可是同样的代码 在物理机上能看到正常的结果啊。在物理机上没死锁,在虚拟机上也不会吧。 再说我是先打印字符串再去获得锁的
要是死锁都这么容易重现的话就不会那么难调试了。 顺便你的第二句话。你自己看看你代码,是先输出还是先获得锁。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧