从接触linux系统下编程,始终困惑着我一个问题,就是我的程序应当如何运行。曾经学习裸机程序和单片机程序的时侯linux操作系统下载,不用考虑这一问题,写好的程序直接在上电的时侯直接由启动代码运行我的main函数。而且在有操作系统的情况下,我编译好的程序如何执行呢?总不能我每次要自动去执行啊~!纠结了三年了,呵呵,从2010.12月到2011.1月,期间边学习linux下编程红旗linux安装,边找寻这方面的资料,哎,据说这些技术对人家很简单啊,百度上的极少,总算找到一篇,如下;
开机后手动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中。有的开发板开机后手动运行图形界面程序,须要按住ctrl+c让开发板步入到linux的SHELL提示符界面。虽然可通过注释掉rc.local文件中调用图形界面的命令,降低运行用户应用程序的命令,达到开机手动运行用户应用程序的目的。
下边以我做的实验为例,描述具体的实现步骤。该方式始于网路,我加以验证,稍做更改,此文相当于转载。
1.步入pc机的Linux操作系统,在/nfs/usr/下通过mkdirlz命令新建一个名为lz的文件夹,步入lz文件夹,通过mkdirhello新建一个hello文件夹拿来储存我们即将编撰的hello.c文件和编译生成的可执行文件。
2.在/nfs/usr/lz/hello下通过vihello.c命令新建hello.c文件,编辑如下测试程序:#includeintmain(){printf("Hello,testarm-linux!n");return0;}完成编辑后通过:wq保存后退出。
3.主机通过如下命令交叉编译环境编译hello.c:#arm-linux-gcc–ohellohello.c
4.通过ls命令可以看见在/nfs/usr/lz/hello/下早已生成了hello可执行文件,我们可以在开发板上通过./hello来测试自己编撰的hello.c执行情况
5.更改rc.local文件,在文件的最后通过‘#’释掉启动图形界面的指令,降低执行用户应用程序hello的指令,具体实现如下:#exportPATH=$QPEDIR/bin:$PATH#qtopia#/usr/qtopia/bin/qtopia/usr/lz/hello/./hello注:前三行是注释掉启动图形界面,最后一行是添加的执行用户的hello测试程序。
6.重启开发板,通过vivi参数配置让开发板通过nfs挂载主机上的文件系统,这时我们就可以通过超级终端听到开发板早已运行了我们编撰的hello程序。
这个给了我很大启发,我就沿着rc.local结合自己的板子来试验哈,我的是GT2440的板子,上面没有rc.local,然而发觉有个rcS,原先这就是启动脚本,打开我的rcS如下:[[email protected]]#cat/etc/init.d/rcS
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask022
exportPATHrunlevelprevlevel##TrapCTRL-C&conlyinthisshellsowecaninterruptsubprocesses.#
trap":"INTQUITTSTP/bin/hostnameGTStudio
/bin/mount-n-tprocnone/proc
/bin/mount-n-tsysfsnone/sys
/bin/mount-n-tusbfsnone/proc/bus/usb
/bin/mount-tramfsnone/dev
echo/sbin/mdev>/proc/sys/kernel/hotplug/
sbin/mdev-s#mountingfilesystemspecifiedin/etc/fstab
mkdir-p/dev/pts
mkdir-p/dev/shm/bin/
mount-n-tdevptsnone/dev/pts-omode=0622
/bin/mount-n-ttmpfstmpfs/dev/shm
/bin/mount-n-tramfsnone/tmp
/bin/mount-n-tramfsnone/var
mkdir-p/var/empty
mkdir-p/var/log
mkdir-p/var/lock
mkdir-p/var/run
mkdir-p/var/tmp
/sbin/hwclock-ssyslogd/etc/rc.d/init.d/netdstart
echo"">/dev/tty1
echo"Startingnetworking...">/dev/tty1
sleep1
etc/rc.d/init.d/httpdstart
echo"">/dev/tty1echo"Startingwebserver...">/dev/tty1
sleep1
/etc/rc.d/init.d/ledsstart
echo"">/dev/tty1
echo"Startingledsservice...">/dev/tty1
echo""
sleep1
/sbin/ifconfiglo127.0.0.1/etc/init.d/ifconfig-eth0/
bin/qtopia&echo"">/dev/tty1
echo"StartingQtopia,pleasewaiting...">/dev/tty1
在这基础上我做了二个实验,第一个就是在usr/sbin下复制写好的openclose程序,在bin/etc/rc.d/init.d下编译脚本如下:#!/bin/sh
base=openclose#Seehowwewerecalled.
case"$1"instart)/usr/bin/$base&;;stop)
pid=`/bin/pidof$base`
if[-n"$pid"];
thenkill-9$pid
fi;;
esacexit0
刚开始以为这样就可以了,重启板子后linux自动运行,发觉没有运行,研究了哈/etc/init.d和/etc/rc.d/init.d的区别和联系,发觉还得再/etc/init.d/rcS的脚本里写进echo"Startingopenclose">/dev/tty1/etc/rc.d/init.d/openclosestart这样能够运行,同样倘若输入/etc/rc.d/init.d/openclosestop则不能运行程序,我的理解是这etc/inir.d须要有指向etc/rc.d/init.d/openclose的句子linux自动运行,能够决定是否执行(startorstop)openclose里的指向程序(本实验室中base=openclose).第二个实验就是尝试在etc/inir.d/rcS里直接运行我的程序,刚开始通过直接入./mns/nfs/writeread/arm-linux-gcc-4.3.3/writeread(我这儿是通过nfs服务来运行我的程序的),发觉不能运行,后来还是把writeread拷贝到usr/sbin里,这样通过./usr/sbin/writeread开机能够直接运行了。