在busybox构建文件系统章节我们已经大概了解,文件系统启动后执行的第一个用户进程是init进程,init进程会解析etc/inittab文件,执行inittab中的各个子进程,打开文件系统中inittab文件:
第5行指定了系统启动进入的默认运行级别为5;
第9行是sysinit action,init程序会首先执行该进程;
第12行在单用户模式下需要执行的操作;
然后22-28就是系统不同的运行级别;
通过代码注释可知,级别0是halt模式,关闭系统;
级别1是单用户模式,级别2-5是多用户模式,级别6是重启系统;
在第5行已经指定了本系统运行级别为5,所以,在执行完成sysinit:/etc/init.d/rcS之后,会执行l5:5:wait:/etc/init.d/rc 5,这句代码是将5这个参数传给etc/init.d/rc脚本,然后执行etc/rc5.d目录下的所有脚本,打开etc/rc5.d目录:
可看到这些都是以S字符开头的符号链接,S符号之后的数字是,执行优先级别,由小到大依次执行。这些符号链接都有对应的脚本文件。我们通常将自己的自运行程序或者脚本放到优先级别最低的文件中,比如S99rc.local中,该符号链接所对应的脚本文件是etc/init.d/rc.local:
| 14:11 S99rc.local -> ../init.d/rc.local |
在etc/init.d/rc.local中又会执行etc/rc.local,我们也可以把应用程序和脚本放到etc/rc.local中。当然也可以自己定义一个自启动脚本,然后在etc/rc5.d目录建立一个符号链接链接到此脚本。例如在etc/目录下自己创建了autorun.sh脚本文件,在etc/rc5.d目录下建立了符号链接S99autorun.sh,链接到了etc/autorun.sh文件:
| 3月 16 13:32 S99autorun.sh -> ../autorun.sh |
现在将我们的应用放到autorun.sh中。首先,建立一个应用源程序文件my_app.c:
| #include <stdio.h>
void main(void) { while(1) { printf("hello wold!!! rn"); sleep(1); } } |
编译生成my_app:
| . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
elf@ubuntu:~/work/elf/rootfs$ $CC my_app.c -o my_app |
通过nfs网络文件系统,或者其他方式将my_app复制到开发板文件系统usr/目录下。
然后,将my_app加入到etc/autorun.sh中后台运行:
| #! /bin/sh
./usr/my_app & |
保存退出,reboot重启系统后,程序运行:
若想关闭此应用:
使用ps –ef查看应用的进程号:
| root@ELF1:~# ps –ef |
| root 618 1 0 10:23 ? 00:00:00 ./usr/my_app |
kill关闭进程:
| root@ELF1:~# kill 618 |
542