popen结合管道,获取命令的输出结果

        shell的功能比较强大,很多时候直接调用system()创建一个单独进程去跑。如果我们只想知道命令是否执行成功,判断system的返回值等信息即可,但是有时候我们想要获取该命令执行之后的输出信息。

可以使用 popen()创建并写入管道,再fgets()读管道得到命令的输出。

如果数据量比较大,有时候需要配合管道符号 | 还有grep命令,awk来筛选信息

下面使用了两次popen,第一次是查找文件的文件,第二次是ls -l命令,配合awk输出第五列的信息(即文件的大小信息),当然也可以使用stat结构来获取啦,只是做个演示罢了,谢谢~

       

int getSystemShellReture()
{
    char cmd[128] = "find / -name Polaris";
    char result[128] = {0};

    FILE *fp = NULL;
    fp = popen(cmd,"r");
    if(fp == NULL)
    {
        printf("popen error\n");
        return -1;
    }

    // 读管道,得到输出
    if(fgets(result,sizeof(result),fp) == NULL)
    {
        printf("fgets error\n");
        return -1;
    }
    printf("Location of file : %s\n",result);
    
    pclose(fp);

    int lastIndex = strlen(result);

    // 需要把最后的换行符替换为字符串结束符,否则下方结合管道时候,会只执行前半段,后半段会有问题
    printf("lastIndex = %ld\n",lastIndex);
    if(result[lastIndex-1] == '\n')
    {
        result[lastIndex-1] = '\0';
    }

    // 输出第五项
    snprintf(cmd,sizeof(cmd),"ls -l %s | awk '{print $5}'",result);
    fp = popen(cmd,"r");
    if(fp == NULL)
    {
        printf("popen error\n");
        return -1;
    }

    // 读管道
    if(fgets(result,sizeof(result),fp) == NULL)
    {
        printf("fgets error\n");
        return -1;
    }
    printf("Info of file : %s\n",result);

    // 转换字符串为数字
    int fileSize = 0;
    sscanf(result,"%d",&fileSize);
    printf("fileSize = %ld,-100 = %ld\n",fileSize,fileSize-100);
    pclose(fp);
    

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值