• 使用管道进行读取执行命令的返回值


    背景

    我们经常会使用system()函数执行命令,那样是因为我们不需要要执行后返回的数据,如果我们需要返回的数据呢?今天介绍一种可以得到我们返回数据的操作。

    作者:良知犹存

    转载授权以及围观:欢迎关注微信公众号羽林君

    或者添加作者个人微信:become_me


    管道具体操作

    管道(pipe)

    管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递,可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

    基于管道细节使用我就不多做描述了,这篇文章描述的很详细,大家可以参考https://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html

    代码

    我直接附我使用的代码,主要逻辑执行了cat /sys/class/sweep_robot/radar/radar_gpio_control命令,检查该IO是否为ON的状态。

    bool ChecklidarGpio(void)
    {
    	bool ret = false;
    	char buf[33] = {0};
    	std::string get_msg;
    
    	FILE* sta = NULL;
    	sta = popen("cat /sys/class/lidar/radar/radar_gpio_control","r");
    
    	fgets(buf,sizeof(buf),sta);
    	PRINTF("lidar",  kWarn,"sta:%s",buf);
    	get_msg = buf;
    
    	int n = 0;
    	if((n = get_msg.find("ON")) != string::npos)
    	{
    		LOG("lidar",  kWarn, ""<< n << ","<< get_msg.substr(n));
    		ret = true;
    	}
    	pclose(sta);
    	return ret;
    }
    
    int main()
    {
    
    	bool gpio_sta = ChecklidarGpio();
    		PRINTF("lidar",  kWarn,"lidarGpio sta:%d",gpio_sta);
    		if(!gpio_sta)// 1s 启动一次
    		{
    			lidarPmGpio('1');
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。

    测试log如下:


    其中我把管道读取回来的数据转换成立std::string,并使用find函数进行搜索,大家可以按照自己要求分别使用find 、find_first_of 、find_last_of 、find_first_not_of 、compare其中适合自己的函数。

    结语

    这就是我自己的一些使用pipe读取执行命令返回值的使用分享。如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。


    作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。

                                  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
    
    • 1

    推荐阅读

    【1】jetson nano开发使用的基础详细分享

    【2】Linux开发coredump文件分析实战分享

    【3】CPU中的程序是怎么运行起来的 必读

    【4】cartographer环境建立以及建图测试

    【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

    本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

  • 相关阅读:
    day 32 文件上传&二次渲染&.htaccess&变异免杀
    新手如何开始Microstation CE版二次开发
    Linux下lsof命令使用
    一文吃透 Go 内置 RPC 原理
    java Spring Boot pattern.console日志配置中clr支持的颜色
    Python学习:整数类型(int)详解
    安装内核切换内核
    java计算机毕业设计积分权益商城源码+mysql数据库+系统+lw文档+部署
    R语言【数据管理】
    HarmonyOS4.0系列——01、下载、安装、配置环境、搭建页面以及运行示例代码
  • 原文地址:https://blog.csdn.net/lyn631579741/article/details/125993865