您的位置:首页 > 运维架构

popen和pclose

2019-03-27 12:48 78 查看

最简单的两个程序之间传递数据的方法就是使用popen和pclose 函数,原型如下:
#include<stdio.h>
FILE *popen(const char *command,const char *open_mode);
in pclose(FILE *stream_to_close);
1、popen函数
popen可以允许一个程序将另一个程序作为新进程来启动,并可以传递数据给他或者他接收数据。command字符串是要运行的程序名和相应的参数。open_mode 必须是“r”后者“w”;

如果是“r”,被调用程序的输出可以作为调用程序的输入,调用程序利用popen函数返回的FILE*文件的流指针,通过stdio的库函数(fread)来读取被调用的程序的输出。如果是“w”,则调用程序可以用fwrite 调用程序发送数据,被调用者可以在自己的标准输入上读取这些数据。被调用的程序一般不会意识到自己正在从另一个进程读取数据,它只是在标准输入流上读取数据,然后进行相应的操作。

每一个popen调用都必须要有一个“r”或者“w”,其标准实现都不支持其他任何选项,所以我们不能同时对另一个程序进行读写操作,只能二选一;popen函数失败返回一个空指针,要实现双向通信,必须要使用两个管道。

2、pclose函数
用于在popen启动之后,将其关联的文件流关闭。pclose调用只在popen启动进程结束之后才返回,如果调用pclose时它还在运行,pclose 将阻塞,等待该进程结束。
pclose返回值通常为它所关闭的文件流所在进程的退出码

popen函数的好处
在Linux/类unix系统中所有的参数扩展都是由shell来完成的,所以,在启动程序之前想启动shell来分析命令字符串,就可以使各种shell扩展在程序启动之前就全部完成。这使我们可以通过popen启动非常复杂的shell命令,但其他创建进程的函数(execl)调用起来就复杂的多,因为调用进程必须自己去完成shell扩展
不足:
每个popen都要启动两个进程,即一个被请求的程序,还要启动一个shell;调用的成本略高,且目标指令的调用比正常方式要慢一些。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: