嵌入式Linux中让应用程序自动启动

2019-07-13 00:17发布

1.通过/Linuxrc脚本直接启动Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息。初始化完成后,通常调用的是init,通过loader调用init内的init=/app_program语句(通过loader向核心传入init=/program可以定制首先运行的程序)。比如在桌面Linux系统中,init进程会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用开发中,可以根据实际情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了,在这里可以采用比较灵活的措施。
2.在/etc/init.d下添加启动脚本一般情况下,大多数的Linux操作系统使用/etc/init.d/(或/etc/rc.d/init.d)下的脚本来配置应用程序的自动启动。例如,在某些Linux系统中,corn程序通过/etc/init.d/corn脚本启动,Apache通过/etc/init.d/httpd启动,syslogd通过/etc/init.d/syslogd启动,而sshd则通过/etc/init.d/sshd脚本启动。通常这些脚本通过来自特定rc.d目录的符号链接运行。为了配置从哪个rc.d目录运行脚本,Linux系统提供了许多不同的工具,同时也可以手工进行配置。Linux系统有一个包含所有实际启动脚本文件的目录。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同时对应每个运行级别(runlevel)又有一个另外的目录,它们可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。这些目录中的文件通常是指向实际脚本文件的符号链接。
3.直接在/etc/rc.d/rc.local脚本中添加命令在Linux系统中,有一个类似Windows系统中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系统开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的这个文件中。因此可以编辑rc.local文件,将要执行的程序(命令)添加到该文件夹中。Linux系统在启动后还未登录前,将自动执行该程序(命令),达到开机自动运行用户的应用程序的目的。下面具体说明:首先解压ramdisk.image.gz文件,然后挂载到系统中。接着创建自己的应用程序文件夹hello,将所要自动运行的应用程序hello复制到该文件夹。然后打开/usr/etc/rc.local文件,在最后一行加入:/Myapp/hello/hello再按上面的顺序将ramdisk.image打包下载到目标板,启动运行,则可以看到用户编写的应用程序一启动就运行起来了。本文参考《基于ARM9的嵌入式Linux开发技术》,李新峰等编著。







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