在Linux编程中,C程序占据主要的代码功能,而Linux环境中脚本是非常有效的工具,有时候甚至比C更方便直接,只需要一句脚本就可以完成C需要很多行才能完成的功能。但是这有个问题,C程序如果获取脚本执行的结果呢?
有以下两种方案。
1、使用shell重定向功能,将脚本的执行结果重定向到一个文件中,然后C程序利用文件操作来读取这个文件的内容。
看下面这个例子,这个函数是将$HOME的系统变量读取到C程序的变量buffer中。
#include <stdio.h>
int main()
{
FILE *fp;
//打印系统变量$HOME,当然你也可以将这个脚本存入一个文件然后执行这个文件。
const char test[] = "echo $HOME > /var/run/test.txt";
system(test);//执行脚本
char buffer[100];
if ((fp = fopen("/var/run/test.txt", "r")) == NULL)
return -1;
else if (fgets(buffer, 100, fp) != NULL)
printf("%s",buffer);
fclose(fp);
}
2、第一种方法的缺点是要产生新文件,这存在风险,比如目录是否可读,读取文件失败等问题。实际上执行脚本是在当前进程fork一个子进程来执行脚本的。那么是不是可以利用进程间通信的方法来避免生成文件呢,这当然是可以的,此处我们介绍使用popen()函数。
以下摘自xx百科:
popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来
开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O
流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行
exit 一样。
popen直接返回文件描述符,那么这就省去了我们读取文件的过程,其余操作和方法1一样了,此处不再示例了。
本文作者原创,转载请说明来源。
阅读(538) | 评论(0) | 转发(0) |