C 语言popen函数,逐行读取shell命令内容

目录

1. popen()函数

2. 描述

3. 示例


1. popen()函数

头文件:#include <stdio.h>

函数原型:FILE * popen(const char * command, const char * type);

关闭文件流:int pclose(FILE * stream);

  函数popen 先执行fork,然后调用exec以执行cmd,并且返回一个标准I/O文件指针。

  cmd是一个包含shell命令的字符串指针(以NULL结束字符结尾);
  如果type是"r",则文件指针连接到cmd的标准输出;
  如果type是"w",则文件指针连接到cmd的标准输入。

2. 描述

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

  command 参数是一个字符串指针, 指向的是 一个以 null 结束符结尾的字符串, 这个字符串包含一个 shell 命令. 这个命令被送到 /bin/sh 以 -c 参数执行, 即由 shell 来执行. type 参数也是一个 指向以 null 结束符结尾的字符串的指针, 这个字符串必须是 'r' 或者 'w’ 来指明是读还是写.

   popen() 函数的返回值是一个普通的标准I/O流, 它只能用 pclose() 函数来关闭, 而不是 fclose() 函数.

  注意, popen 函数的输出流默认是被全缓冲的;pclose 函数等待相关的进程结束并返回一个 command 命令的退出状态, 就像 wait4 函数 一样

3. 示例

下面示例是将shell命令行下ls -l打印的所有内容保存到句柄fp,然后通过while (fgets(buf, 255, fp) !=NULL)将ls -l输出的所有信息进行逐行保存到buf中,并打印输出。

#include <stdio.h>

int main(void)
{
    FILE * fp;
    if ((fp = popen("ls -l", "r)) == NULL)
    {
        perror("open failed!");
        return -1;
    }
    char but[256];
    /*下面将ls -l输出的所有信息进行逐行保存到buf中,并打印输*/
    while (fgets(but, 255, fp) != NULL) {    
        printf("%s", buf);
    }
    if (pclose(fp) == -1)
    {
        perror("close failed!");
        return -2;
    }
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smartvxworks

创造不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值