在做项目时,需要在进程中执行一个shell命令,最先想到的便是fork()一个子进程再去execl执行命令,后来发现了popen函数,简单化了这个过程。当然,popen创建的也是子进程。popen函数会创建一个管道用于父子进程间通信。父进程通过管道读信息或者写信息,至于是读还是写取决于父进程调用popen时传递的参数(r、w)

一、函数定义

头文件:stdio.h

函数:FILE *popen(const char *command, const char *type)

函数功能:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。如果type是"r"则文件指针连接到command的标准输出,读取命令的标准输出;如果type是"w"则文件指针连接到command的标准输入,写入命令的标准输入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的标准输出设备或是写入到子进程的标准输入设备中

返回值:若成功则返回标准I/O流文件指针(FILE *),否则返回NULL,错误原因存于errno中

函数:int pclose(FILE * stream);

函数功能:函数功能:pclose()用来关闭由popen所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针

返回值:若成功返回shell的终止状态(即子进程的终止状态),若出错返回-1,错误原因存于errno中

二、简单应用

在程序中想执行以下ping测试:

ping -I eth0 -c 2 www.baidu.com

ping_test.c

#include <stdio.h>
#include <errno.h>
#include <string.h>int main(int argc,char **argv)
{int                     rc = 0;                 // 用于接收命令返回值int                     rv=-1;FILE                    *fp;char                    command[128];char                    result_buf[1024];/*将要执行的命令写入buf*/snprintf(command, sizeof(command), "ping -I eth0 -c 2 www.baidu.com");printf("command=%s\n",command);/*执行预先设定的命令,并读出该命令的标准输出*/fp = popen(command, "r");    //这时执行shell命令的相关内容不会出现在标准输出上if( NULL == fp ){printf("popen ping_test failure.\n");return -1;}printf("popen ping_test successfully!\n");/*读ping的内容,因为fp是标准I/O流文件指针,所以要用fread来读*/if( (rv=fread(result_buf,1,sizeof(result_buf),fp))<0 ){printf("Read from fp failure:%s\n",strerror(errno));return -2;}printf("result_buf=%s\n",result_buf);rc = pclose(fp);    //关闭文件指针if(-1 == rc){printf("close file point failure.\n");return -3;}return 0;
}

结果:

popen函数的简单应用相关推荐

  1. exec族函数、system函数、popen函数、PATH

    exec族函数函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序.当进程调用exec函数时,该进程被完全替换为新程序(在exec都后面的代码不会被得到执行 ...

  2. system函数和popen函数使用方法

    system int system(const char *command); system()函数的返回值如下: 成功,则返回进程的状态值: 当sh不能执行时,返回127: 失败返回-1: 其实是封 ...

  3. 用popen函数操作其它程序的输入和输出

    一.函数介绍 1.1函数原型: #include <stdio.h> FILE *popen(const char *command,const char *open_mode); 1.2 ...

  4. 关于os.popen函数打开exe程序无法正确运行的问题。

    都说野生的动物好,但是放在程序猿身上,我觉得更是一种无奈.没有人指引,没有人教导,有的只是一颗探索,学习的心.这颗心让我们披荆斩棘.最终看到我们想要的成果.从一句简单的print('hello wor ...

  5. linux popen 函数,Linux下使用popen()执行shell命令

    函数原型: #include "stdio.h" FILE popen( const char command, const char* mode ) 参数说明: command: ...

  6. python的popen函数

    最近了解了一下python的popen函数的使用,主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd) 返回值: 返回一个文件句柄 i ...

  7. js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称

    1,列举对象属性的名称 <script language="javascript"> var obj=new Object(); obj.a="您好,我是田洪 ...

  8. php特殊函数,PHP常用特殊运算符号和函数的简单示例

    这篇文章主要为大家详细介绍了PHP常用特殊运算符号和函数的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 注解符号: // 单行注解 多行注解 ...

  9. 内存分配的几个函数的简单对比分析

    今天在看<<改善c++程序的150个建议>>一书,了解到在栈上也可以动态分配内存,具体的方法是通过alloca函数来完成.i 再次复习查看了一下C语言中的几个分配内存的函数,简 ...

最新文章

  1. Github 总结!「Java知识体系详细汇总2021版」开放下载了!
  2. 引进博士:118万安家房补+18万经费;硕士:42万安家房补+10万经费
  3. Install NSCA
  4. 我怀疑对象做了什么对不起我的事......
  5. php 转换数组为小写,PHP如何将数组键转换为小写?
  6. Lagom学习 四 CompletionStage
  7. Fortinet 荣膺谷歌云年度安全技术合作伙伴奖
  8. hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:
  9. java特殊字符转义html_java转义html特殊字符
  10. Hybrid Skeleton Driven Surface Registration for Temporally Consistent Volumetric Video
  11. 【TSP】基于matlab遗传算法求解13城市旅行商问题【含Matlab源码 1255期】
  12. android app整包更新,uniapp热更新和整包更新
  13. unique mapped reads
  14. 背诵考研英语单词计划总览
  15. OGG/OGV文件格式解析
  16. SAP CRM BOL entity deletion - root node and sub node
  17. Google翻译修复小工具
  18. Ribbons界面介绍(2)——这是不是合适的用户界面
  19. R柱状图,叠图(排序)
  20. optional说明

热门文章

  1. Pushlet 学习
  2. python 柱状图和折线图放在一起_Python matplotlib:matplotlib绘制——柱状图和折线图的组合...
  3. 爬虫 豆瓣音乐 top250
  4. Linux电源管理之 Suspend
  5. Java sleep suspend_Java中sleep Wait yield Suspend的区别
  6. 黑马程序员JAVA基础-进制
  7. 中国菜刀使用(图片上传漏洞)
  8. Kotlin forEach中实现break
  9. 中小企业如何做好营销团队管理
  10. 计算机三级信息安全技术 | 填空题 10 重点标注版