相信对看了后面几节内容的同学来说,在linux中开发C语言程序早已不在话下了。不过,不晓得你们注意到没,我们自己写的C语言程序编译后,要想在shell中执行,常常还要将可执行程序的路径也输入。
执行自定义的C语言程序,须要输入路径
比如,C语言程序编译后的可执行文件名是a.out,要想执行它,须要输入的命令是
# ./a.out
./表示当前路径。倘若直接输入a.out,是会报错的
# a.out a.out: command not found
明明当前目录下有a.out这个文件,系统却提示“commandnotfound(未能找到命令)”。而执行常用的ls、gcc等命令却不用输入路径,这是为何呢?
linux中的环境变量
根据百科上的解释,环境变量(environmentvariables)通常是指在操作系统中拿来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。linux操作系统中有好多种环境变量,常用的有
等等。linux操作系统中的目录特别多,查找命令和程序时,不可能遍历所有目录,不然就太低效了。所以,linux使用PATH环境变量记录若干目录,在用户输入不带路径的命令时,只去那些目录查询,这样就防止了遍历所有目录造成的系统响应平缓。
在linux中可以使用echo命令查看环境变量。例倘若查询PATH环境变量,可以输入:
# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
可以看出linux下载工具,PATH环境变量记录了若干目录,这种目录之间使用“:”隔开。用户输入不带路径的命令时,linux只会去那些目录查找,假如找不到都会报错:“commandnotfound”。
如今查看以下a.out的路径:
# ls a.out cscope.files cscope.out his sim.out t2.c t3.c t4.c t6.c t.c testparamfun.c test.txt # pwd /lccRoot/C/tmp
果然不在PATH记录的目录上面,这就理解为何只输入a.outlinux查看桌面环境变量,系统会报错了。
假如希望我们自己编撰的C语言程序,才能像ls、mkdir、touch等系统命令一样不用输入路径才能执行,可以将a.out移到PATH记录的这些目录里:
# cp a.out /usr/local/bin # a.out hello embedTime
也可以把a.out所在目录添加到PATH里:
# export PATH=$PATH:/lccRoot/C/tmp # a.out hello embedTime
使用C语言操作环境变量
linux中C语言提供了getenv函数获取环境变量,它的说明指南如下:
getenv接收一个环境变量名作为参数,返回环境变量值。C语言还提供了putenv函数用户设置环境变量:
它接收一个字符串作为参数,成功返回0,失败返回非0。参数字符串的格式为
环境变量名=环境变量值
假如环境变量名不存在,则putenv函数添加该环境变量。假如环境变量名早已存在,则putenv函数更改该环境变量值。现今编撰C程序:
#include #include int main() { char *env; printf("before calling putenv:n"); env = getenv("PATH"); printf("tPATH: %sn", env); env = getenv("embedTime"); printf("tembedTime: %sn", env); printf("after calling putenv:n"); putenv("PATH=xxx"); putenv("embedTime=test"); env = getenv("PATH"); printf("tPATH: %sn", env); env = getenv("embedTime"); printf("tembedTime: %sn", env); return 0; }
程序很简单,先获取PATH环境变量linux查看桌面环境变量,之后尝试获取embedTime环境变量,并把获取的结果复印下来。之后使用putenv函数重新设置PATH和embedTime环境变量,再度获取之并复印。编译以上程序,执行得到如下结果:
# gcc test.c # ./a.out before calling putenv: PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/lccRoot/C/tmp embedTime: (null) after calling putenv: PATH: xxx embedTime: test
可以看出,一开始C语言程序成功的获取了PATH的值,而embedTime并不存在,因而复印出了NULL。在使用putenv函数更改了环境变量以后,PATH和embedTime环境变量都被更改为了指定的值。
嵌入式底层有时也须要接收后端控制发过来的命令,boa服务和cgi程序就是一个不错的选择,而boa正是使用环境变量传递get和post报文的。
欢迎在评论区一起讨论,指责。文章都是手打原创,每晚最通俗的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看见最新更新和之前的文章哦。