cceczjxy的空间
cceczjxy 烟台市 在线状态
356次访问,排名915好友21人,关注者51
asdf
注册时间:2007-4-5
登录时间:2008-6-29
[加为好友] [即时聊天] [发私信]
cceczjxy的个人资料
所在行业:计算机软件
社区头衔:社区专家
个人专长:
c,linux,嵌入式,数据库也下过一番功夫。
专家分: 目前总共有12684分
Linux/Unix社区:10125分 C/C++:2459分 扩充话题:48分
博客:目前总共有0条评论
访问量:16
排名:20000名之外
文章数:1条
cceczjxy的好友
cceczjxy的留言
zlai_2001发表于:2008-05-08
感谢你回复我的问题:紧急求助:关于循环中的定时器问题
while(1) 

  n=recvfrom(...); 
  if(n  <0) 

   printf("error"); 
   exit(1); 

  alarm(1); 
}  

你把alarm(1)放在recvfrom前边,并且你需要在if(n <0)内加判断,用来区别recvfrome是因为信号退出的。 

alarm设置的信号是一次有效,你其它怎么设置的呀? 
这样的需求,一般用setitimer来设置时钟信号。 

不过不能将alarm(1)放在recvfrom前面,因为要在收到数据包后开始计时,放在前面就不能完成这个功能了。。 
请帮帮忙吧,我实在是不知道该怎样实现这样的功能。。
capa发表于:2007-12-17
非常感谢cceczjxy给我的留言,我好像有点明白了.

在我这边的情况中,所有操作都是用root运行的,所以可能不是原因1.
应该是原因2,不过还是有些问题.例如:1.dlopen使用mmap把.so的内容映射到内存,这时对.so文件的改动应该不会影响进程空间,否则也不会把.so文件删除了,进程还可以运行.所以,直接覆盖.so文件(我使用的是cp命令)只是仅仅影响了文件中数据,而不关系到进程.2.我试验过,即使是用一个完全相同的.so文件覆盖(cp命令),也会产生段错误,这是不是说明
文件中的数据是否改变,和进程空间无关?.3.是不是mmap就是如下这么实现的:你把一个文件映射到进程空间后,你删除,ok,没问题,但是你不能write(cp命令实际上就是使用了write系统调用)这个文件,无论你写什么,否则就有段错误.
以上只是我的一点点理解,还希望cceczjxy多多指点
capa发表于:2007-12-12
我使用dlopen/dlsym打开一个.so文件,并调用其中的函数.

由于.so文件中的函数定义发生了变化,需要在不重新启动进程的情况下更新.so文件

我发现如果直接将新的.so文件覆盖旧的.so文件,程序就发生段错误

如果先删除旧的.so文件, 再将新.so文件复制过来,就可以运行

不知怎么回事? 望各位老大指点, 多谢!

Slackware, 内核2.4, gcc2.95
回复于 2007-12-13
1,有可能是文件的权限的原因,直接覆盖文件,会保留被覆盖文件的各种权限,删除再拷贝会用新文件的权限. 2,dlopen/dlsym是用的mmap把.so的内容映射到内存中了,并关闭打开的文件,是通过文件的inode来读取实际的内容的,你直接覆盖文件时,文件的inode节点会保留,只是指向的实际内容改变了,这时,再通过映射到内存的指针读时,就会出错的. 删除文件再复制,就不存在那样的问题. 不过,如果.so文件内,对象的位置在替换前后发生变化,也可能出错.
luohonglove发表于:2007-08-24
大虾谢谢你帮我解决问题,我是一个刚刚走入软件行业的人,很想和你交个朋友!
我的msn是:lois_lh@hotmail.com,如果赏脸就请加了吧!
回复于 2007-08-25
抱歉,我不能用msn,只能用邮箱,偶尔可以用用qq, 有事情可以发邮件: cceczjxy@yahoo.com.cn
给cceczjxy的留言
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo