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);