linux poen函数
2014-02-25 17:18
447 查看
函数原型:
#include “stdio.h”
FILE *popen( const char* command, const char* mode )
参数说明:
command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
返回值:
如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断
int pclose (FILE* stream)
参数说明:
stream:popen返回的文件指针
返回值:
如果调用失败,返回 -1
作用:
popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。
例子:
管道读:先创建一个文件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 !
当使用type 参数为 “r" 时,popen 会把执行 command 后的标准输出重定向到管道流。但是,command执行中的标准错误输出,在管道流中得不到。
那么,有没有办法来同时获取到 command 执行后的标准输出和标准错误输出呢?答案是肯定的!
只要在 command 中,将标准错误输出重定向到标准输出即可!
例如:
FILE *stream;
stream = popen(, "cp -f 2>&1", "r");
while(fgets(s, 1024, stream))
{
printf(s);
}
#include “stdio.h”
FILE *popen( const char* command, const char* mode )
参数说明:
command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
返回值:
如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断
int pclose (FILE* stream)
参数说明:
stream:popen返回的文件指针
返回值:
如果调用失败,返回 -1
作用:
popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。
例子:
管道读:先创建一个文件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 !
当使用type 参数为 “r" 时,popen 会把执行 command 后的标准输出重定向到管道流。但是,command执行中的标准错误输出,在管道流中得不到。
那么,有没有办法来同时获取到 command 执行后的标准输出和标准错误输出呢?答案是肯定的!
只要在 command 中,将标准错误输出重定向到标准输出即可!
例如:
FILE *stream;
stream = popen(, "cp -f 2>&1", "r");
while(fgets(s, 1024, stream))
{
printf(s);
}
相关文章推荐
- 运维工程师必会的109个Linux命令
- linux rtc驱动
- linux grep命令
- 去年12月29日,红旗Linux员工在网上发出请愿书“风雨飘摇,中科红旗路在啊何方?”,又打出横幅”软件所还我核高基专项款,大股东无视职工死活“,到工信部大门口集体请愿、讨薪,闹得很不安宁。
- Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)
- 在嵌入式Linux系统中实现USB存储设备的自动挂载
- centos6.4下编译apue.h(第二版)
- 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)
- linux 链接脚本
- Linux文件系统之hard link&symbol link
- centos初装后并没有带上rz sz的程序。需要安装: yum install lrzsz
- windows下eclipse远程连接linux上的hadoop集群
- Linux crontab 任务调度的使用
- linux进程后台运行的几种方法
- Linux开机启动程序详解[转]
- CentOS 6.5 X64 U盘启动盘制作
- Linux环境下修改MySQL端口方法:
- Linux环境下修改MySQL端口方法: 分类: database ubuntu 测试 2014-02-25 16:42 3334人阅读 评论(0) 收藏
- Linux Find 命令使用
- linux stat命令、inode内容--ctime,mtime,atime的区别