cat user.conf | awk ‘{if($0 ~ /^tom[[:blank:]] /) print $1 $2 female $3; else print}”
通过 system()这个函数,我们就可以在 c 中调用以上脚本,完成任务了。
但是,system() 用起来还是觉得不爽,它的不足是只能执行脚本,却无法获得脚本的输出数据,而这通常是我们进一步处理的数据来源。(在shell和perl中,可以通过反引号( `` )来取得命令的输出结果)。一个解决办法是把输出结果重定向到一个临时文件中,然后在c中读取文件,获取数据,最后当然还要删除这个文件。不过,这个方法总是让人觉得有一点点不爽,如果能直接把脚本执行中输出的数据输到我们的缓冲区来就更好了。
我写了个小函数,叫 my_system(),通过管道以及重定向,实现了以上想法。函数原型如下:
int my_system(const char* pCmd, char* pResult, int size);
输出数据被保存到 pResult所指向的缓冲区中,缓冲区大小为 size,最多可以保存 size-1的数据。
函数的实现放在本文的最后
有了这个函数以后,在 c中调用脚本就更方便了,我们可以通过它来实现对 user.conf的查询。
4)、查询一个记录
例如,我们要获取 tom 的性别
可以用脚本这样来实现:
cat user.conf | awk ‘/^tom[[:blank:]] / {print $3}“
脚本的执行结果是 tom的性别 male被输出到屏幕上
在我们的 c程序中,如此调用 my_system(),
char buf[101];
my_system(“cat user.conf | awk ‘/^tom[[:blank:]] / {print $3}””, buf, 101);
调用完以后,buf中的数据就是 “male”了,怎么样,还算方便吧?
以上只是用结合脚本完成了一个比较简单的任务,所以我没有把这些脚本单独形成脚本文件。如果你善于使用 perl、shell、awk,那么可以写出更强大的脚本文件来处理更复杂的问题,然后通过类似 my_system( )的方法,在 c/c 等其它语言中取得脚本的输出结果,实现有趣的“混合编程”。
希望你能从中得到乐趣!
#include
#include
#include
#include
#include
static int my_system(const char* pCmd, char* pResult, int size)
{
int fd[2];
int pid;
int count;
int left;
char* p = 0;
int maxlen = size – 1;
memset(pResult, 0, size);
if(pipe(fd))
{
printf(“pipe error\n”);
return –1;
}
if((pid = fork()) == 0)
{// chile process
int fd2[2];
if(pipe(fd2))
{
printf(“pipe2 error\n”);
return –1;
}
close(1);
dup2(fd2[1],1);