言:任何事情都一樣,原理弄清楚了,所有的問題將變得不再神秘。
學電腦的人都知道,在任何同一時刻,電腦只能執行一條指令,而且都是順序往下執行的(除非遇到跳轉指令)。
Linux的進程啟動都是根據啟動指令碼裡的指令進行的,主要有兩類:init 和bash. init 是所有指令碼的最頂端,首先被執行,而bash一般是登陸shell 的時候才會被調用。
不同的檔案系統具體的啟動指令檔名稱是不一樣的。以我使用的檔案系統(yaffs)為例,/etc/init.d/rcS 作為init 的指令碼,如果你想開機時進入自己的應用程式,則在rcS裡面寫入就可以。比如我想啟動/usr/qtopia/chip 則在裡面寫入/usr/qtopia/chip –qws 就可以。
/etc/init.d/profile 作為bash 的指令碼 ,在這個指令碼裡的指令 開機時不會被執行,但是你進入shell 狀態時,就會被調用,一般來說bash 指令碼多數用來存放環境變數,記住,每一次進入shell 都會調用一次bash 指令碼。
來看看我分析一個常式,在/usr/qtopia 裡有一個qt 程式,不採用自啟動的方式,而是利用終端輸入(進入終端就意味著進入shell)開啟,這時候沒問題,程式正常被開啟,這說明裡我的qt 庫lib 的環境變數設定沒問題。
但是當我採用自啟動的方式,即在/etc/init/rcS 裡加入/usr/qtopia/chip –qws 時卻提示 error while loading share qtlib.so.4 ````````為什麼呢。
原因是這樣的:我的環境變數放在/etc/profile 而程式執行指令放在/etc/init.d/rcS ,這裡就會出現一個問題,rcS 最先被執行 而profile 還沒被執行,這樣很明顯找不到lib 了嘛,回頭看終端輸入啟動,為什麼就找到lib 呢 。很簡單,你開啟終端時,bash 已經被調用。這樣,執行的順序變為首先執行/etc/profile 然後才執行你的指令。
註:ubuntu 系統的bash 指令碼是 ~/.bashrc 或者 /etc/bashrc