头文件: #include <stdio.h>


函数说明:


FILE * popen ( const char * command , const char * type );
int pclose ( FILE * stream );


说明:(参考unix环境高级编程)


popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以​​运行命令​​来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。


type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。


command 参数是一个指向以 NULL 结束的 shell 命令字符串的​​指针​​。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。


popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen 的进程相同。



例子一:


#include <sys/types.h>  
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
FILE *fpin;
FILE *fpout;
char buf[1024];

memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中
fpin = popen( "ls -l", "r" ); //将“ls -l”命令的输出 通过管道读取(“r”参数)到FILE* stream
fpout = fopen( "test_popen.txt", "w+"); //新建一个可写的文件

fread( buf, sizeof(char), sizeof(buf), fpin); //将刚刚FILE* fpin的数据流读取到buf中
fwrite( buf, 1, sizeof(buf), fpout);//将buf中的数据写到FILE* fpout对应的流中,也是写到文件中

pclose( fpin );
fclose( fpout );

return 0;
}


[uglychen@chenxun popen]$ gcc popen.c 
[uglychen@chenxun popen]$ ./a.out 
[uglychen@chenxun popen]$ cat test_popen.txt 
total 24
-rwxrwxr-x 1 uglychen uglychen 5680 Jun 14 14:04 a.out
-rw-rw-r-- 1 uglychen uglychen  771 Jun 14 14:03 popen.c
-rw-rw-r-- 1 uglychen uglychen    0 Jun 14 14:05 test_popen.txt


例子二:popen2.c

#include <sys/types.h>  
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <sys/wait.h>

#define PAGER "${PAGER:-more}" /* environment variable, or default */

#define MAXLINE 4096
int main(int argc, char *argv[])
{
char line[MAXLINE];
FILE *fpin, *fpout;

if (argc != 2)
printf("usage: a.out <pathname>");
if ((fpin = fopen(argv[1], "r")) == NULL)
printf("can't open %s", argv[1]);

if ((fpout = popen(PAGER, "w")) == NULL)
printf("popen error");

/* copy argv[1] to pager */
while (fgets(line, MAXLINE, fpin) != NULL) {
if (fputs(line, fpout) == EOF)
printf("fputs error to pipe");
}
if (ferror(fpin))
printf("fgets error");
if (pclose(fpout) == -1)
printf("pclose error");

exit(0);
}


[uglychen@chenxun popen]$ gcc popen2.c -o popen2

[uglychen@chenxun popen]$ ls

a.out  popen2  popen2.c  popen.c  test_popen.txt

[uglychen@chenxun popen]$ ./popen2 

Segmentation fault

[uglychen@chenxun popen]$ ./popen2   /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

news:x:9:13:news:/etc/news:

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

pcap:x:77:77::/var/arpwatch:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

avahi:x:70:70:Avahi daemon:/:/sbin/nologin

rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin

mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin

gdm:x:42:42::/var/gdm:/sbin/nologin

uglychen:x:500:501:uglychen:/home/uglychen:/bin/bash

chen1:x:501:502::/home/chen1:/bin/bash



例子三: