【C\C++】程序如何执行shell命令并获取执行结果|popen

目录

使用popen 方法

头文件

函数定义

函数说明

返回值

返回错误

例子

注意事项


使用popen 方法

popen()可以执行shell命令,并读取此命令的返回值; 与pclose函数配对使用。

头文件

#include <stdio.h>

函数定义

FILE * popen ( const char * command , const char * type );

int pclose ( FILE * stream );

函数说明

popen() 函数fork一个子进程,并在二者间创建一个管道并返回一个指向流的指针fd,该流可用于读取或写入管道。子进程启动shell环境执行command指定的命令,结果写入管道。

由于管道是单向的,type参数可以指定仅读取或写,而不是两者兼而有之;结果流被相应地只读或只写。

这个fd必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。

popen(3) - Linux manual page

type          "r" 则文件指针连接到 command 的标准输出; "w" 则文件指针连接到 command 的标准输入。

command  执行的命令。(以NULL结尾)

返回值

如果调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流。

返回错误

popen 没有为内存分配失败设置 errno 值。

如果调用 fork() 或 pipe() 时出现错误,errno 被设为相应的错误类型。

如果 type 参数不合法,errno将返回EINVAL。

例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
void
print_result(FILE *fp)
{
        char buf[100];
 
        if(!fp) {
                return;
        }
        printf("\n>>>\n");
        while(memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf) - 1, fp) != 0 ) {
                printf("%s", buf);
        }
        printf("\n<<<\n");
}
 
int
main(void)
{
        FILE *fp = NULL;
 
        while(1) {
                fp = NULL;
                fp = popen("ls", "r");
                if(!fp) {
                        perror("popen");
                        exit(EXIT_FAILURE);
                }
                print_result(fp);
                pclose(fp);
                sleep(1);
        }
}


参考:https://blog.csdn.net/stone8761/article/details/77498439

注意事项

popen 会fork 子进程,所以注意系统对资源的限制是否会影响。

popen 里面执行shell命令时,如果不是给的绝对路径,则需要注意systemctl 启动的时候 *.service的环境变量配置,否则可能找不到命令而执行不了。

其他方法:

C++ 执行cmd命令 并读取输出 - liujx2019 - 博客园

C或C++如何通过程序执行shell命令并获取命令执行结果?_FightingBoom的博客-CSDN博客_c++执行shell命令

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值