.so的动态卸载与替换问题

spymin812 2010-12-25 07:27:24
加精
一个正在运行的程序调用了一个.so文件,现在要用有新的.so替换旧的.so文件,在不关闭程序的情况下,如何替换
就是如何动态的卸载旧库并替换为新库加载,中途不关闭程序
...全文
3295 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
okbaozhen 2012-01-03
  • 打赏
  • 举报
回复
没看明白
fytzzh 2011-03-29
  • 打赏
  • 举报
回复
当然需要一些通知机制有些的so可以动态加载。

这就涉及到进程间通讯

一般可以选择使用:
信号
套接字 (如果仅仅是本地可以选择域套接字)
管道

只要能进程间通讯都可以
fytzzh 2011-03-29
  • 打赏
  • 举报
回复
ganjianh8 正解
ketao_78 2011-03-21
  • 打赏
  • 举报
回复
为啥要这么做
ecsape 2011-01-04
  • 打赏
  • 举报
回复
有趣的帖子,收藏了。
只是觉得inotify_init(),inotify_add_watch()好像有点浪费。可以用管道通讯,socket等方式在.so改变时通知程序更换。
dungeonsnd 2011-01-02
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 feiyinzilgd 的回复:]

引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?


inotify_init()
inotify_add_watch()

对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。

再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]

这样应该对性能有影响吧。
因为这一事件发生的次数非常少,浪费了不必要的CPU时间。
kingstarer 2011-01-01
  • 打赏
  • 举报
回复
重新dlopen就行了

通知程序更新方法有很多 可以通过自动比较文件修改时间 也可能通过手工发送信号通知程序
DACE2012 2010-12-31
  • 打赏
  • 举报
回复
这个方法好,回去试试
ZHU1113 2010-12-31
  • 打赏
  • 举报
回复
不明白!!!
nilite 2010-12-31
  • 打赏
  • 举报
回复
太奇怪了,我找遍Glibc的手册和linux kernel API手册,都没有找到这两个函数,但是可以man到,也可以在我的libc下面找到相关的头文件,27楼,请告诉我,我平时该从何处获得这些函数?

[Quote=引用 27 楼 feiyinzilgd 的回复:]

引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?


inotify_init()
inotify_add_watch()

对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。

再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]
nilite 2010-12-31
  • 打赏
  • 举报
回复
我想问一下23楼,要看哪方面的资料,才能了解这些系统调用,怎么我翻glibc的手册,根本找不到这两个函数,但是man一下还是有的。

[Quote=引用 23 楼 feiyinzilgd 的回复:]

引用 15 楼 hzy_76 的回复:

有一个思路不知道Linux下是否可行,如果文件系统在文件替换时能发出中断信号,并允许程序进行干预的话,可以不用这个办法。但就我目前的水平,只能这么做。
引用 11 楼 feiyinzilgd 的回复:
引用 9 楼 hzy_76 的回复:

我觉得应该没问题,但需要程序控制,当需要更新.so文件时,等待所有调用结束后,dlclose,然后替换……
[/Quote]
arkor 2010-12-30
  • 打赏
  • 举报
回复
楼上已经回答了。
冷卡卡西 2010-12-29
  • 打赏
  • 举报
回复
参考下这个:
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201011209823241/
冷卡卡西 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 feiyinzilgd 的回复:]

引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?


inotify_init()
inotify_add_watch()

对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。

再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]
这个方法妙。。。。
cnlm2 2010-12-29
  • 打赏
  • 举报
回复
dlclose
dlopen
南极星0628 2010-12-28
  • 打赏
  • 举报
回复
必须动态调入.so,这样直接换文件,程序重新读入即可
aguang423 2010-12-28
  • 打赏
  • 举报
回复
楼上正解
谭海燕 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hzy_76 的回复:]

有一个思路不知道Linux下是否可行,如果文件系统在文件替换时能发出中断信号,并允许程序进行干预的话,可以不用这个办法。但就我目前的水平,只能这么做。
引用 11 楼 feiyinzilgd 的回复:
引用 9 楼 hzy_76 的回复:

我觉得应该没问题,但需要程序控制,当需要更新.so文件时,等待所有调用结束后,dlclose,然后替换,然后再重新dlopen。


这个方法……
[/Quote]

是的。你可以监视文件系统。 2.6内核目前已经提供了相关的函数和机制让你来监视文件系统的变化。
jiminlan521 2010-12-28
  • 打赏
  • 举报
回复
好资料,收藏一下。
dxh7281371 2010-12-28
  • 打赏
  • 举报
回复
不错的东西
加载更多回复(12)

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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