码迷,mamicode.com
首页 > 其他好文 > 详细

UNIX环境高级编程之-----popen函数

时间:2015-06-15 09:14:43      阅读:187      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!