popen/pclose 函数

news2025/1/10 2:49:03

函数作用

如果说system在一定程度上是execl的优化版,那么popen就一定程度上是system的优化版,使用popen不仅可以运行代码,还可以获取运行的输出结果但是system和exec族函数还是非常重要的,也有自己的特定应用场景)。

并且popen函数使用到了管道的概念(之后会详细学习):

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

需要添加的库

#include <stdio.h>

函数原型

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

函数参数

  • command:是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令
  • type:只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入,如果想要实现类似system功能,此处应该是"r"
  • 返回值:如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL

实操演示

demo6.c:

根据上面所说,fopen返回的是一个文件流(FILE *型),那么如果想要读取流的数据其实就是使用之前学到的fread函数,详见:

使用fopen等标准C库来操作文件_mjmmm的博客-CSDN博客

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


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

    fp = popen("ls -l","r");

    //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    fread(&ret, sizeof(char), 1024, fp);

    printf("return value of ls = %s\n",ret);

    pclose(fp);
    
    return 0;
}

运行代码:

虽然实现的效果似乎和之前没什么区别,但其实很不一样,system或execl调用后只能将结果打印在屏幕上,结果的数据是无法保存的而popen的结果是可以保存的,之所以打到屏幕上是我使用了printf,如果我不使用printf而是将这些数据写入其他文件或进行其他操作,那么system和execl就无法做到了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始搭建ns3环境以及NetAnim简单使用

一、环境准备 ns3是基于GNU/Linux平台使用C开发的工具软件&#xff0c;在windows系统中安装使用ns3环境&#xff0c;可以使用虚拟机VMware并安装ubuntu系统来实现&#xff0c;现将本教程所用到的虚拟机和系统镜像放到网盘提供下载 名称链接提取码VMware Workstation 17 Proht…

Docker镜像查看下载删除镜像文件的相关命令

1.镜像相关命令 本地查看有哪些镜像文件&#xff1a; docker images镜像的名称就是我们常见的一些软件&#xff0c;镜像相当于把软件和软件所需要的运行环境打包到一个镜像文件里面&#xff0c;将来在通过这个镜像文件创建出对应的容器&#xff0c;容器有了以后这些软件自动的…

system函数

函数作用 执行一个shell的命令 其实通过查看system函数的源码就会发现&#xff0c;system函数调用后会进行一次fork&#xff0c;然后就会在子进程中运行“execl("/bin/sh", "sh", "-c", command, (char *) 0);” 而“sh -c XXX” 这个命令&…

IC设计仿真云架构

对于IC仿真来说&#xff0c;最重要的是要安全、可维护、高性能的的HPC环境环境。 那么云上如何搭建起一套完整的IC仿真云环境呢&#xff1f; 这种架构应该长什么样子&#xff1f; 桌面虚拟化基础架构 将所有桌面虚拟机在数据中心进行托管并统一管理&#xff1b;同时用户能够…

学习笔记整理-JS-04-流程控制语句

文章目录 一、条件语句1. if语句的基本使用2. if else if多条件分支3. if语句算法题4. switch语句5. 三元运算符 二、循环语句1. for循环语句2. for循环算法题3. while循环语句4. break和continue5. do while语句 三、初识算法1. 什么是算法2. 累加器和累乘器3. 穷举法4. 综合算…

python根据已有列计算其他列

根据已有列计算其他列 1、根据已有列新增列2、根据已有列修改其他列 读取数据源 import pandas as pd # 读取智能大师号码信息 path1 r../excelFile-j/flower.csv df_data pd.read_csv(path1) # df_data 内容1、根据已有列新增列 方式一&#xff1a;根据单列 df_data["…

Python遥感开发之分段读取和保存遥感数据

Python遥感开发之分段读取和保存遥感数据 1 分段读取数据2 实现分批读取数据以及进行计算3 实现分批保存成TIF文件&#xff08;所有完整代码&#xff09;4 分段TIF整合到一个TIF5 生成一个空白TIF&#xff08;每个像元值为0的TIF&#xff09; 前言&#xff1a;当遇到批量读取大…

DIP: Spectral Bias of DIP 频谱偏置解释DIP

On Measuring and Controlling the Spectral Bias of the Deep Image Prior 文章目录 On Measuring and Controlling the Spectral Bias of the Deep Image Prior1. 方法原理1.1 动机1.2 相关概念1.3 方法原理频带一致度量与网络退化谱偏移和网络结构的关系Lipschitz-controlle…

DCMM数据管理成熟度之数据治理-数据治理沟通

​01 标准原文 1 概述 数据治理沟通旨在确保组织内全部利益相关者都能及时了解相关政策、标准、流程、角色、职责、计划的最新情况,开展数据管理和应用相关的培训,掌握数据管理相关的知识和技能。数据治理沟通旨在建立与提升跨部门及部门内部数据管理能力,提升数据资产意识,…

读发布!设计与部署稳定的分布式系统(第2版)笔记31_版本问题

1. 在软件与外部环境之间的许多交汇点上&#xff0c;版本控制基本上处于混乱状态 1.1. 不应该为了更新自身系统的API&#xff0c;而让服务消费者被迫与你同时发布新版本 1.2. 多数服务新版本的发布应该具有兼容性 2. 分层的“约定”栈 2.1. 连接握手和持续时间 2.2. 请求组…

华为在ospf area 0单区域的情况下结合pbr对数据包的来回路径进行控制

配置思路&#xff1a; 两边去的包在R1上用mqc进行下一跳重定向 两边回程包在R4上用mqc进行下一跳重定向 最终让内网 192.168.10.0出去的数据包来回全走上面R-1-2-4 192.168.20.0出去的数据包来回全走 下面R1-3-4 R2和R3就是简单ospf配置和宣告&#xff0c;其它没有配置&#…

Python爬虫(十一)_案例:使用正则表达式的爬虫

本章将结合先前所学的爬虫和正则表达式知识&#xff0c;做一个简单的爬虫案例&#xff0c;更多内容请参考:Python学习指南 现在拥有了正则表达式这把神兵利器&#xff0c;我们就可以进行对爬取到的全部网页源代码进行筛选了。 下面我们一起尝试一下爬取内涵段子网站&#xff1…

《C语言深度解剖》.pdf

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 C语言深度解剖.pdf 提取码:yunx

使用cloud-int部署nginx

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口&#xff0c;高级中使用自定义数据&#xff0c;初始化虚拟机&#xff0c;安装nginx 连接CLI&#xff0c;验证是否安装成功 访问虚拟机IP查看是否部署成功 参考文档&#xff1a; https://learn.microsoft.com/zh-cn…

代码随想录算法训练营之JAVA|第二十八天|122. 买卖股票的最佳时机 II

今天是第28天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 122. 买卖股票的最佳时机 IIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 第一想法 题目理解&#xff1a;找到一个升序的段&#xff0c;然后累加每一个升序的段头尾的…

ORCA优化器浅析——CXform base class for all transformations

CXform CXforml类作为所有transformation的基础类&#xff0c;其包含了pattern成员m_pexpr。主要是在exploration和implementation expression流程中使用&#xff0c;主要调用Transform函数。其还包含返回相关xforms的集合函数&#xff0c;比如PbsIndexJoinXforms等。 class …

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…

2023年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;字符长方形 给定一个字符&#xff0c;用它构造一个长为4个字符&#xff0c;宽为3个字符的长方形&#xff0c;可以参考样例输出。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 输入只有一行&#xff0c; 包含一个字符。 输出 该字符构成的长方形…

Mysql主从分离

一、前言 某个应用场景中&#xff0c;在操作数据库这部分&#xff0c;往往是数据库的读取往往大于数据库的写入&#xff0c;当读取数据达到数据库的瓶颈时&#xff0c;性能下滑&#xff0c;影响数据的写入&#xff0c;导致整个应用的不可用。为了解决这个问题&#xff0c;这时&…

java热插拔组件 SPI机制

文章目录 前言一、热插拔(spi机制)是什么&#xff1f;二、使用步骤1.利用java META-INF2.利用google spi3. 测试效果 总结 前言 在项目中,如果想要增加项目的灵活性,健壮性, 高逼格,那么你要对于java中的一些机制有了解; 例如: java中的spi机制spring中的spring.factories 等…