Chinaunix首页 | 论坛 | 博客
  • 博客访问: 644224
  • 博文数量: 227
  • 博客积分: 8017
  • 博客等级: 中将
  • 技术积分: 2069
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-08 22:50
文章分类

全部博文(227)

文章存档

2011年(10)

2010年(55)

2009年(28)

2008年(134)

我的朋友

分类: C/C++

2010-11-24 16:52:08

以前不知道怎么在C程序中执行一个shell命令并获取其结果,(system好像只能够执行命令)。
popen就可以做到。

1. 描述

popen函数用创建管道的方式启动 一个进程, 并调用shell. 因为管道是被定义成单向的, 所以 type 参数 只能定义成只读或者只写, 不能是两者同时, 结果流也相应的是只读或者只写.

command参数是一个字符串指针, 指向的是一个以null结束符结尾的字符串, 这个字符串包含一个shell命令. 这个命令被送到/bin/sh以-c参数执行。

type参数也是一个指向以null结束符结尾的字符串的指针, 这个字符串必须是"r"或者"w"来指明是读还是写.

popen函数的返回值是一个普通的标准I/O流, 它只能用pclose函数来关闭, 而不是 fclose函数. 向这个流 的写入被转化为对command命令的标准输入; 而command命令的标准输出则是和调用popen(), 函数的进程相同,除非这个被command命令自己改变. 相反的, 读取一个 ”被popen了的“流, 就相当于读取command命令的 标准输出, 而command的标准输入则是和调用popen, 函数的进程相同。

注意, popen函数的输出流默认是被全缓冲的。

pclose函数等待相关的进程结束并返回一个command命令的退出状态, 就像wait4函数一样。


2. 示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char buf[1024] = {0};
    FILE *fp;

    if((fp = popen("df -m|grep '/'", "r")) == NULL){
        printf("popen error!\n");
        exit(1);
    }

    fread(buf, sizeof(char), sizeof(buf), fp);
    printf("result buffer:\n %s", buf);

    int size, used, avail, percent;
    size = used = avail = percent = 0;
    char *ptr, *record;
    record = buf;
    printf("\nparsing content:\n");
    while((ptr = strchr(record, ' ')) != NULL){
        *ptr++ = 0;
        if (*record == '\n')
            record++;
        sscanf(ptr, "%d%d%d%d", &size, &used, &avail, &percent);
        printf("filesytem:%10s size:%6dMB used:%6dMB avail:%6dMB percent:%d%%\n",
               record, size, used, avail, percent);
        record = strchr(ptr, '\n');
    }
    printf("\n");
    pclose(fp);
    return 0;
}



3. 程序结果:


result buffer:
/dev/sda6                72433     22219     46534  33% /
tmpfs                      998         7       992   1% /dev/shm

parsing content:
filesytem: /dev/sda6  size: 72433MB used: 22219MB avail: 46534MB percent:33%
filesytem:     tmpfs     size:   998MB  used:     7MB    avail:   992MB   percent:1%
阅读(1129) | 评论(0) | 转发(0) |
0

上一篇:epoll学习

下一篇:linux c编程的听课笔记

给主人留下些什么吧!~~