当前位置: 首页 > news >正文

popen和fgets函数

`popen`和`fgets`都是在 C 语言编程中常用的函数,它们在不同方面发挥着重要作用。

**一、`popen`函数**

1. **函数功能**:

- `popen`函数用于创建一个管道,连接到一个子进程,这个子进程可以是一个 shell 命令。它允许程序与外部命令进行交互,执行命令并读取命令的输出或向命令发送输入。

- 例如,可以使用`popen`执行系统命令并获取命令的输出结果,方便地在 C 程序中调用外部工具和获取系统信息。

2. **函数原型**:

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

- `command`是要执行的命令字符串。

- `type`是指定管道的方向,可以是"r"表示从子进程读取输出,或者是"w"表示向子进程写入输入。 3. **返回值**:

- 如果成功,`popen`返回一个指向`FILE`类型的流指针,可以使用标准的文件输入/输出函数(如`fgets`、`fputs`等)来操作这个流。

- 如果失败,返回`NULL`,并设置`errno`来指示错误原因。

4. **注意事项**:

- 使用`popen`创建的管道是单向的,要么用于读取子进程的输出,要么用于向子进程发送输入,不能同时进行读写。 - 在使用完毕后,应该调用`pclose`函数来关闭管道并等待子进程结束,以避免资源泄漏。

**二、`fgets`函数**

1. **函数功能**:

- `fgets`函数用于从指定的文件流中读取一行字符串。它从输入流中读取字符,直到遇到换行符`\n`、文件结束标志或达到指定的最大长度减一为止。 - 这个函数通常用于读取文本文件、标准输入或从管道中读取数据。

2. **函数原型**:

- `char *fgets(char *s, int n, FILE *stream);`

- `s`是指向存储读取字符串的字符数组的指针。

- `n`是要读取的最大字符数。

- `stream`是指向要读取的文件流的指针。

3. **返回值**:

- 如果成功读取一行,`fgets`返回`s`,即指向存储字符串的字符数组的指针。

- 如果到达文件末尾或发生错误,返回`NULL`。

4. **注意事项**:

- `fgets`会在读取的字符串末尾自动添加一个 null 终止符`\0`。

- 如果读取的行长度超过`n - 1`,`fgets`只会读取`n - 1`个字符,并在末尾添加`\0`,剩余的字符将留在输入流中等待下一次读取。

- 在从标准输入读取时,可以使用`Ctrl+D`(在 Unix/Linux 系统中)或`Ctrl+Z`(在 Windows 系统中)来表示文件结束。

总之,`popen`和`fgets`在 C 语言中可以结合使用来执行外部命令并读取命令的输出结果。

例如,可以使用`popen`执行一个命令,然后使用`fgets`从命令的输出流中逐行读取结果。这样的组合在需要与外部程序交互、处理命令输出或进行系统级操作时非常有用。

        FILE *pResultStr = popen(command, "r");if (pResultStr == NULL) {SPI_HAL_LOGERR("执行 pidof 命令失败\n");return;}if (fgets(szBuf, sizeof(szBuf), pResultStr) != NULL) {// 移除换行符szBuf[strcspn(szBuf, "\n")] = '\0';}pclose(pResultStr);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一道ssrf题目--Web-ssrfme
  • vue3 composition 模式下watch object
  • 软考架构-构件技术
  • 高亮你的文字:CSS ::selection 伪元素的魔法
  • 关于springboot对接通义千问大模型的尝试(一)
  • 【Docker】Docker 的基本概念和优势简介
  • 数据库和缓存不一致的问题及解决方案
  • Redis篇三:在Ubuntu下安装Redis
  • Python生成JMeter测试脚本----HTTP信息头管理器和用户定义的变量
  • 使用gitee存储项目
  • Java中的序列化与反序列化深度剖析
  • 分局高清视频监控及监控中心项目-技术方案(下)
  • 【Kotlin设计模式】Kotlin实现适配器模式
  • 硬件面试经典 100 题(81~90)题
  • 【Linux】第十七章 多路转接(select+poll+epoll)
  • @jsonView过滤属性
  • [译] 怎样写一个基础的编译器
  • Apache的基本使用
  • conda常用的命令
  • JavaScript HTML DOM
  • js如何打印object对象
  • magento 货币换算
  • MySQL几个简单SQL的优化
  • MySQL-事务管理(基础)
  • springMvc学习笔记(2)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 大型网站性能监测、分析与优化常见问题QA
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #pragma once
  • ${ }的特别功能
  • (k8s)Kubernetes本地存储接入
  • (ros//EnvironmentVariables)ros环境变量
  • (九)信息融合方式简介
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .bashrc在哪里,alias妙用
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net Redis的秒杀Dome和异步执行
  • .net SqlSugarHelper
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET微信公众号开发-2.0创建自定义菜单
  • .Net转前端开发-启航篇,如何定制博客园主题
  • //TODO 注释的作用
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Conditional注解详解
  • @ModelAttribute注解使用
  • [Angular] 笔记 21:@ViewChild
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法