概述

popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这篇文章重点给大家介绍Linux中popen函数的作用,感兴趣的朋友一起看看吧

popen函数介绍

函数定义

#include <stdio.h>
FILE * popen(const char *command , const char *type );
int pclose(FILE *stream);

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

type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入。

command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。

popen()的返回值是个标准I/O流,必须由pclose来终止。前面提到这个流是单向的(只能用于读或写)。向这个流写内容相当于写入该命令的标准输入,命令的标准输出和调用popen()的进程相同;与之相反的,从流中读数据相当于读取命令的标准输出,命令的标准输入和调用popen()的进程相同。

返回值
 如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL。

参数说明

  • command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
  • mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。

作用
popen函数允许一个程序将另外一个程序作为新进程来启动,并可以传递数据或者通过它接受数据。

其内部实现为调用 fork 产生一个子进程,执行一个 shell, 以运行命令来开启一个进程,这个进程必须由 pclose() 函数关闭。

缺点
使用popen的不好影响是,针对每个popen调用,不仅要启动一个被请求的程序,还要启动一个shell,即每个popen调用将多启动两个进程。

举例

#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{ FILE *fp=NULL; FILE *fh=NULL; char buff[128]={0};   memset(buff,0,sizeof(buff)); fp=popen("ls -l","r");//将命令ls-l 同过管道读到fp fh=fopen("shell.c","w+");// 创建一个可写的文件 fread(buff,1,127,fp);//将fp的数据流读到buff中 fwrite(buff,1,127,fh);//将buff的数据写入fh指向的文件中   pclose(fp); fclose(fh);   return 0;
}

参考资料
https://www.jb51.net/article/140783.htm
https://www.xuebuyuan.com/3236032.html

Linux中popen函数的作用小结相关推荐

  1. linux中popen函数,system函数与popen函数

    为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作: fork一个子进程: 在子进程中调用exec函数去执行command: 在父进程中调用wait ...

  2. Linux中fork函数的作用及用法

    https://blog.csdn.net/weixin_40853073/article/details/81873398

  3. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  4. STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32中NVIC_SystemReset()函数的作用?什么时候用? STM32软件复位有两种方式 (1)方式一:NVIC_SystemReset()函数用来复位STM32. 注意1:从SYSRE ...

  5. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  6. 每天学一点儿shell:linux中时间函数的date的用法

    文章目录 1.linux中date函数格式 2.date日期函数的具体用法 2.1.获取相应格式的日期 2.2.获取相隔时间段的日期 2.2.1.获取今天的日期 2.2.2.获取昨天的日期 2.2.3 ...

  7. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  8. linux中request_region()函数的分析

    linux中request_region()函数的分析 struct resource ioport_resource = { .name = "PCI IO", .start = ...

  9. 计算机语言中str是什么意思,python中str函数的作用是什么

    python中str函数的作用是什么 发布时间:2021-04-27 16:12:24 来源:亿速云 阅读:56 作者:Leah python中str函数的作用是什么?相信很多没有经验的人对此束手无策 ...

最新文章

  1. 人工智能案例TOP50,AI是干出来的,不是吹出来的
  2. 参数 ByVal 和 ByRef 区别
  3. TextureView
  4. jquery较验组织机构编码
  5. @Controller,@Service,@Repository,@Component详解
  6. JavaScript高级之构造函数和原型
  7. 函数式编程 读书笔记
  8. 概率论与数理统计思维导图_数学思维到底有多重要?这个学科往往影响国家实力...
  9. box-sizing布局(简要介绍)
  10. 敏感词过滤算法Aho-Corasick
  11. Android腾讯微博开放平台入门(三)Oauth授权
  12. c语言中windows头文件,windows与linux 标准c语言头文件
  13. Thinkphp6 think-queue redis 执行异步任务
  14. 用java根据年份判断生肖_怎样根据年份确定生肖
  15. 电池SOC仿真系列-基于粒子群算法电池参数辨识
  16. Verilog模块语法
  17. 微信小程序头像为什么是模糊的?小程序头像模糊怎么办?
  18. 软考题目之头结点、头指针和首元节点
  19. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】
  20. 前端的Vue相关的项目经验

热门文章

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式
  2. 欧瑞变频器800参数设置_传授你欧瑞变频器频率的设置方法
  3. Qin.Data发布及 使用说明
  4. Hi3531DV100开发环境的搭建(含交叉编译器的安装及官方SDK安装)
  5. NLP实战(三)实现拼写纠错
  6. 个人一年工作情况总结报告
  7. matlab编程是用c语言吗,matlab调用c语言编程.doc
  8. 利用批处理bat批量处理word文档属性
  9. php 公众号token认证,微信公众号开发——Token认证
  10. 《梁启超家书》笔记二——一个人若是在舒服的环境中会消磨志气,那么在困苦懊丧的环境中也一定会消磨志气