Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16514
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-02 10:09
个人简介

摸爬滚打,跌跌撞撞,不忘初心,继续加油。

文章分类

全部博文(10)

文章存档

2016年(4)

2015年(6)

我的朋友

分类: C/C++

2015-07-20 14:43:21

在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) |
给主人留下些什么吧!~~