Posts

Showing posts from February, 2011

[C] 關於 shared library

今晚來複習一下shared library的建置好了, 主要有三個步驟: 1)建立 object codes (.h跟.c檔) 2)建立 library > root#gcc -Wall -fPIC -c test.c -Wall:顯示warning message -fPIC:compile產生position independent code. *PIC大小寫有差異. >> 產生 test.o > root#gcc -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.0 *.o -shared:產生為shared object -Wl:將參數傳給linker, 這裡的參數是 "-soname libtest.so.1". 需要注意的是逗號之間不可以留空白!!! >> 產生 libtest.so.1.0 3)建立 link (optional) 通常會建立 libtest.so 跟 libtest.so.1 >> ln -sf / path / to /libtest.so.1.0 libtest.so >> ln -sf / path / to /libtest.so.1.0 libtest.so.1 libtest.so 是提供其他檔 ex. abc.c檔要compile時, 做naming conversion用 (即 -ltest) libtest.so.1 則是提供執行 abc 時, 做 runtime binding用。 如此在編譯其他的abc.c檔時 >> gcc -Wall -L/ path / to / libtest.so -ltest test.c -o test 然後在執行abc時, 記得將 path / to / libtest.so 加入 $LD_LIBRARY_PATH 中。 當然也可以修改ld.so.conf或執行時指定.so路徑。 另外可以下 ldd test 檢查 executable 所link 的library是否正確。

[OSGi] 關於OSGi的啟動方式

最近在研究OSGi這個框架,遇到一個疑問:OSGi在啟動服務的方式有哪些? 查了網路資料後,約可以分為三類: 1. 在啟動OSGi後,在console自行下install, start, stop bundles的指令. ex. osgi > install gg.sample osgi > start gg.sample 2. 在config.ini上,加上每個要安裝的bundles跟決定它們的狀態. 等OSGi重新啟動後,便會加入該bundles. ex. osgi.bundle= ..., gg.sample@start 但上述兩者皆無法達到自動化的效果,加上當bundles要加很多的時後,這兩個方法就顯的很笨拙。 3. 另外加入一個bundle,繼承bundleActivator,然後統一控管bundle的啟動與否。 出處 不過一般我們對services的default status就是start,這方法似乎有些多餘。而且當第三方要加入新的bundles時, 就必須修改這個bundle,這還是不妥。 但若進一步想問: a. 當我兩個devices相遇時,Device A需要針對Device B的某個bundle進行更新時, b. 當客戶透過Web介面,將某個bundle傳到該device要求更新時, 又該如何呢? 網路上仍找不到相關解答,應該是keyword下的不好... 目前想到可能的做法是: 1. 每個Device安裝一個Service,負責接收/傳送bundle 2. 每個Device安裝一個Update Tracker,根據所接收的bundle,檢查他的bundle名稱+版號看是否存在: 若表示Actived/Resolved -> 表示要求更新 -> 停止舊的bundle -> 啟動新的bundle*. 若沒找到 -> 加入config.ini的osgi.bundle中 -> 啟動該bundle. 移除亦然. 3. 若是b的情況,可以偷吃步 => 重新啟動OSGi. XD *其實這點又多兩個疑惑: a. 啟動的時後,怎麼判定啟動的是哪個版本的bundles? (這似乎又可以用上述的3.來解決!!!) b. 我想應該存在一個bundle,是可以自行檢查某folder下的bundles然後啟動或關閉的,而

新年新希望

距上次發文又過了兩個月, 專注力跟耐心明顯不足 要好好把握今年, 會是個決勝的一年, 要加油了