色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c語言如何實現(xiàn)動態(tài)替換動態(tài)庫so文件后

黃文隆2年前38瀏覽0評論

c語言如何實現(xiàn)動態(tài)替換動態(tài)庫so文件后?

粗略地看,要實現(xiàn)動態(tài)庫的熱升級,需要注意4個點(以Linux為例,其他系統(tǒng)類似):

so文件不依賴ldd加載(也就是主程序的ELF不要跟so文件動態(tài)鏈接,這一點可以通過修改鏈接的命令行實現(xiàn)),而是自己在啟動時主動調(diào)用dlopen/dlclose/g_module_open/g_module_close這類函數(shù)加載和卸載so文件。主程序使用inotify等監(jiān)聽so文件的修改事件。so文件導(dǎo)出熱更新相關(guān)的2個操作,比如可以叫做save_and_stop,restore_and_resume。save_and_stop需要把運行時的狀態(tài)進行序列化,放在內(nèi)存或者文件固定位置,比如一個文件中,然后停止操作(重點是不要再改狀態(tài))。restore_and_resume從這個位置把狀態(tài)讀回來(反序列化),然后繼續(xù)運行它的功能。主程序發(fā)現(xiàn)so文件改動以后,調(diào)用save_and_stop,然后unload動態(tài)庫,然后load新的動態(tài)庫,然后調(diào)用restore_and_resume。根據(jù)具體業(yè)務(wù)不同,這個最好是程序流程中的一個原子操作,比如flush或者suspend一些隊列,暫停處理用戶輸入(主循環(huán)暫停,相關(guān)worker線程暫停)。

如果你的so庫是無狀態(tài)的就更容易了,可以省去序列化反序列化的過程。但是一定要做好事件的同步,主程序不要在卸載和加載的中間狀態(tài)執(zhí)行依賴于動態(tài)庫的操作。

java 線程stop,c語言如何實現(xiàn)動態(tài)替換動態(tài)庫so文件后