函数原型:
#include “stdio.h”
FILE *popen( const char *command, const char* mode )
int pclose(FILE *stream_to_close);
参数说明:
command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
作用:
popen函数允许一个程序将另外一个程序作为新进程来启动,并可以传递数据或者通过它接受数据。
其内部实现为调用 fork 产生一个子进程,执行一个 shell, 以运行命令来开启一个进程,这个进程必须由 pclose() 函数关闭。
缺点:
使用popen的不好影响是,针对每个popen调用,不仅要启动一个被请求的程序,还要启动一个shell,即每个popen调用将多启动两个进程。
举例:
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<string.h> 4 5 int main() 6 { 7 FILE *fp=NULL; 8 FILE *fh=NULL; 9 char buff[128]={0}; 10 11 memset(buff,0,sizeof(buff)); 12 fp=popen("ls -l","r");//将命令ls-l 同过管道读到fp 13 fh=fopen("shell.c","w+");// 创建一个可写的文件 14 fread(buff,1,127,fp);//将fp的数据流读到buff中 15 fwrite(buff,1,127,fh);//将buff的数据写入fh指向的文件中 16 17 pclose(fp); 18 fclose(fh); 19 20 return 0; 21 22 } ~
运行结果:
[lol@localhost practice]$ ls
popen popen.c shell.c
[lol@localhost practice]$ cat shell.c
total 12
-rwxrwxr-x. 1 lol lol 5478 May 24 15:39 popen
-rw-rw-r--. 1 lol lol 473 May 24 15:39 popen.c
-rw-rw-r--. 1 lol lol [lol@localhost practice]$ vim popen.c
[lol@localhost practice]$