前言:任何事情都一样,原理弄清楚了,所有的问题将变得不再神秘。
学计算机的人都知道,在任何同一时刻,计算机只能执行一条指令,而且都是顺序往下执行的(除非遇到跳转指令)。
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