标签:popen函数 linux unix之popen函数
头文件: #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
例子三:
UNIX环境高级编程之-----popen函数
标签:popen函数 linux unix之popen函数
原文地址:http://blog.csdn.net/chenxun_2010/article/details/46497961