分类: LINUX
2016-08-24 17:55:50
转自:
1.
前言
Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过
system函数来调用shell命令。但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果。例如,执行外部命令ping后,如果执行失败,我们希望得到ping的返回信息。
2.
使用临时文件
首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示:
点击(此处)折叠或打开
3.
使用匿名管道
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
在<
在学习unix编程的过程中,发现系统还提供了一个popen函数,可以非常简单的处理调用shell,其函数原型如下:
FILE *popen(const char *command, const char
*type);
该函数的作用是创建一个管道,fork一个进程,然后执行shell,而shell的输出可以采用读取文件的方式获得。采用这种方法,既避免了创建临时文件,又不受输出字符数的限制,推荐使用。
popen使用FIFO管道执行外部程序。
popen 通过type是r还是w确定command的输入/输出方向,r和w是相对command的管道而言的。r表示command从管道中读入,w表示
command通过管道输出到它的stdout,popen返回FIFO管道的文件流指针。pclose则用于使用结束后关闭这个指针。
下面看一个例子:
wanglinbin@SDserver:~/test/C-shell$ gcc popen.c -o popen
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$ ls
popen* popen.c*
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$ ./popen
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$
wanglinbin@SDserver:~/test/C-shell$ cat test_popen.txt
总用量 16
-rwxr-xr-x 1 wanglinbin wanglinbin 10225 8月 24 17:32 popen
-rwxr--r-- 1 wanglinbin wanglinbin 671 8月 24 17:32 popen.c
-rw-r--r-- 1 wanglinbin wanglinbin 0 8月 24 17:33 test_popen.txt
wanglinbin@SDserver:~/test/C-shell$ ls
5.
小结
有统计数据表明,代码的缺陷率是一定的,与所使用的语言无关。Linux提供了很多的实用工具和脚本,在程序中调用工具和脚本,无疑可以简化程序,从而降低代码的缺陷数目。Linux
shell脚本也是一个强大的工具,我们可以根据需要编制脚本,然后在程序中调用自定义脚本。