popen的用法及与system调用的区别

首先用man查看下popen的介绍:

 

popen(3) - Linux man page

Name

 

popen, pclose - pipe stream to or from a process

Synopsis

#include <stdio.h>

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

int pclose(FILE *stream);

 

popen总是和pclose一起出现被使用的。popen() 创建一个管道,通过fork或者invoke一个子进程,然后执行command。返回值在标准IO流中,由于是在管道之中,因此数据流是单向的,command只能产生stdout或者读取stdin,因此type只有两个值:‘w’或‘r’。r表示command从管道中读取数据流,而w表示command的stdout输出到管道中。command无法同时读取和输出。popen返回该FIFO数据流的指针。

举例用法(http://linux.chinaitlab.com/c/806015.html):

 

  管道读:先创建一个文件test,然后再test文件内写入“Read pipe successfully !”

  #include “stdio.h”

  #include “stdlib.h”

  int main()

  {

  FILE *fp;

  char buf[200] = {0};

  if((fp = popen(“cat test”, “r”)) == NULL) {

  perror(“Fail to popen\n”);

  exit(1);

  }

  while(fgets(buf, 200, fp) != NULL) {

  printf(“%s”, buf);

  }

  pclose(fp);

  return 0;

  }

  打印输出: Read pipe successfully !

  管道读:

  #include “stdio.h”

  #include “stdlib.h”

  int main()

  {

  FILE *fp;

  char buf[200] = {0};

  if((fp = popen(“cat > test1″, “w”)) == NULL) {

  perror(“Fail to popen\n”);

  exit(1);

  }

  fwrite(“Read pipe successfully !”, 1, sizeof(“Read pipe successfully !”), fp);

  pclose(fp);

  return 0;

  }

  执行完毕后,当前目录下多了一个test1文件,打开,里面内容为Read pipe successfully !

---------------------------------------------------------------------------------------------

对于管道读例子已经很清楚,而管道写可能用的地方比较少。而对于写可能更常用的是system函数:

system("cat "Read pipe successfully!" > test1")

可以看出,popen可以控制程序的输入或者输出,而system的功能明显要弱一点,比如无法将ls的结果用到程序中。如果不需要使用到程序的I/O数据流,那么system是最方便的。

而且system函数是C89和C99中标准定义的,可以跨平台使用。而popen是Posix 标准函数,可能在某些平台无法使用(windows应该是可以的吧,没做过测试)。

如果上述两个函数还无法满足你的交互需求,那么可以考虑exec函数组了。

时间: 2024-09-14 15:20:13

popen的用法及与system调用的区别的相关文章

c-linux C 想用system()调用子程序可以不?

问题描述 linux C 想用system()调用子程序可以不? 我想调用一个编译好了的dataProcess程序,在dataProcess文件夹下 这样写对不?好像用exec()也是相似的结果... 各种权限应该没问题,都强行chmod 777了...谢谢各位大神~ 解决方案 通过错误信息,是没有找到你的可执行程序,程序路径不对,char mat[128] = "你的可执行的程序的绝对了路径" 解决方案二: 可以啊,参考http://blog.chinaunix.net/uid-20

c语言-C中使用system() 调用了一个pyrhon脚本

问题描述 C中使用system() 调用了一个pyrhon脚本 调用了一个pyrhon脚本,类似于python /path/xxxx.py 但是,返回错误码256.不过我我在控制台直接执行python /path/xxxx.py 可以正常执行...求解,定位半天了,这会在下班回家路上,求解... 解决方案 system是个综合的操作,分解开来看就是相当于执行了 1 fork 生成一个子进程. 2 在子进程执行 execl("/bin/sh","sh","-

system返回值256-redhat5中自启动服务通过system调用磁盘分区脚本返回值256

问题描述 redhat5中自启动服务通过system调用磁盘分区脚本返回值256 在一个自启动服务中通过system调用磁盘分区的脚本,返回值为256,当前用户显示为root,重启服务后又能正常运行,但是每当机器reboot后调用这个分区脚本都会返回错误值256 求牛人帮助 解决方案 http://bbs.csdn.net/topics/391872125

static-类的方法调用与类对象的方法调用的区别?

问题描述 类的方法调用与类对象的方法调用的区别? public class A { public static A a=new A(); public void text() {} } public class B { A.a.test(); A a1=new A(); a1.test() //这两种的调用方法的差别请问是什么啊? public static int c; public int c1; //就是一个用Static变量和没有用static声明一个变量的差别吗? //如果非得那么实现

Python import用法以及与from...import的区别

  这篇文章主要介绍了Python import用法以及与from...import的区别,本文简洁明了,很容易看懂,需要的朋友可以参考下 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了.这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块. eg: 代码如下: import sys pr

java-Java system.out.print*区别

问题描述 Java system.out.print*区别 system.out.println();与system.out.printf();与system.out.print();三种的区别 解决方案 System.out.print();与System.out.println(); 前者输出不换行,比如: System.out.print("a"); System.out.print("b"); 结果: ab 后者输出后换行,比如: System.out.pr

PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)_php技巧

本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

system调用-代码里面用system函数调用系统工具

问题描述 代码里面用system函数调用系统工具 有的调不出来,比如数学输入面板和截图工具,我是64位系统,在64位模式下构建才可以调用,在32位模式下就提示不是命令,但是我现在在做cocos,只有32平台,怎么办? 解决方案 急求啊大家帮帮忙怎么解决? 解决方案二: 64位系统,运行32位平台会导致某些指令不识别的问题,这是window系统的问题,不能解决,唯一的办法就是去找一个64位的平台,望采纳. 解决方案三: 这是应该是由于Windows的WOW64子系统文件系统重定向导致的,在amd6

Android开发之浏览器用法实例详解(调用uc,opera,qq浏览器访问网页)_Android

本文实例讲述了Android开发之浏览器用法.分享给大家供大家参考,具体如下: 一.启动android默认浏览器 Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("http://www.jb51.net"); intent.setData(content_url); startActivity(inten