Linux popen/pclose
popen() 函数
#include <stdio.h>
FILE * popen(const char *command , const char *type );
int pclose(FILE *stream);
用创建管道的方式启动一个进程,并调用shell.
因为管道是被定义成单向的,所以type参数只能定义成只读或者只写,不能是两者同时,结果流也相应的是只读或者只写.
command 参数是一个字符串指针, 指向的是一个以null结束符结尾的字符串, 这个字符串包含一个shell命令. 这个命令被送到/bin/sh以-c参数执行, 即由shell来执行. type参数也是一个指向以null结束符结尾的字符串的指针, 这个字符串必须是 "r" 或者 "w" 来指明是读还是写.
popen()函数的返回值是一个普通的标准I/O流, 它只能用pclose()函数来关闭, 而不是fclose()函数,向这个流的写入被转化为对command 命令的标准输入; 而command命令的标准输出则是和调用popen()函数的进程相同,除非这个被command命令自己改变.
相反的,读取一个"被popen了的"流,就相当于读取command命令的标准输出,而command的标准输入则是和调用popen,函数的进程相同.
注意,popen 函数的输出流默认是被全缓冲的.
pclose 函数
等待相关的进程结束并返回一个 command命令的退出状态
PS:
FILE* stream;
char Buffer[1024];
//将"ls-l"的输出存放到Buffer.
popen("ls-l","r");
fread(Buffer,sizeof(char),sizeof(Buffer));
//将内核log存放到Buffer.
//popen("cat /proc/kmsg","r");
fread(Buffer,sizeof(char),sizeof(Buffer));
//For example:

Linux popen/pclose的更多相关文章
- linux popen()与system()的区别
linux popen()与system()的区别 popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) ). p ...
- popen&pclose管道方式操作shell命令
popen, pclose - pipe stream to or from a process FILE *popen( const char *command, const char *type) ...
- [apue] popen/pclose 疑点解惑
问题请看这里: [apue] 使用 popen/pclose 的一点疑问 当时怀疑是pclose关闭了使用完成的管道,因此在pclose之前加一个足够长的sleep,再次观察进程文件列表: 哈哈,这下 ...
- [apue] 使用 popen/pclose 的一点疑问
当我们需要将输出作为标准输入传递给一个命令,或者将一个命令的输出作为标准输入来读取, 一般会想到使用pipe与fork相结合的方式,来重定向标准输入/输出给指定命令. popen/pclose 帮助我 ...
- linux popen 获取 ip test ok
任务:unix,linux通过c程序获取本机IP. 1. 标准I/O库函数相对于系统调用的函数多了个缓冲区(,buf),安全性上通过buf 防溢出. 2.printf 这类输出函数中“ ”若包含“记得 ...
- popen pclose 不等待命令执行完毕
$handle = popen("start D:\\test.bat", "r"); //exec("start D:\\test.bat" ...
- linux popen函数
描述 popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也 ...
- popen()/pclose()阻塞性问题验证
背景: popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数. pclos ...
- popen && pclose函数
1. 函数操作: 创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止: 2. 函数原型: #include <stdio.h> F ...
随机推荐
- 【COGS1384】鱼儿仪仗队
[题目描述] Jzyz的池塘里有很多条鱼,鱼儿们现在决定组成一个仪仗队.现在备选的N(1 <= N <= 100,000)条鱼排成了一条直线,并且按照亲近关系排的队伍,鱼儿的顺序不能改变, ...
- input border IE6 bug
border:none;与border:0;的区别体现有两点:一是理论上的性能差异二是浏览器兼容性的差异. 1.性能差异[border:0;]把border设为“0”像素虽然在页面上看不见,但按bor ...
- 『重构--改善既有代码的设计』读书笔记----Remove Assignments to Parameters
C++存在按值传递和按引用传递两种传递方式,Java严格按照按值传递这种方式来进行.以按值传递方式的角度来说,如果你 int test(int a) { ) { a = 1; } return a; ...
- connect network is unreachable 解决办法
详细教程见:http://blog.csdn.net/liukun321/article/details/6662950 1.虚拟机中的centos系统要连接外网,我们需要使用桥接网络 2.正常配置e ...
- 如何在C#添加鼠标右键菜单
C#添加鼠标右键方法步骤: 1 选中要添加右键功能的Form或者控件,打开控件的设计页面. 2 从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页面上.这时系 ...
- [ JS 进阶 ] 如何改进代码性能 (3)
原文链接 总结一下 1.减少操作dom的次数 2.需要多次使用某全局变量的时候,将其赋给一个局部变量,避免重复查找 3.优化循环 4.多用逗号和直接赋值的方式来var,减少工厂方式和构造函数方式创建对 ...
- jdk-动态代理
1.HelloWorld package reflect.proxy; public interface HelloWorld { void print(); } 2.HelloWorldImpl p ...
- Linux 搭建php扩展开发框架
1.安装phpize(如果是使用php源码编译就免了,本身就有) 2.打开php源码,ext中有ext_skel工具,使用它可以方便 ./ext_skel --extname = myext 生成扩展 ...
- Egret 矢量绘图、遮罩、碰撞检测
矢量绘图: 1. 为矢量绘图绘制外边 - graphics.lineStype() private createGameScene():void { console.log("Runtime ...
- Scut:通用配置管理器
1. 配置节 ConfigSection private List<ConfigNode> _configNodes; public class ConfigNode { public C ...