popen和pclose函数


理论:

库函数: popen();
函数声明: FILE *popen ( char *command, char *type);
返回值: new file stream on success

NULL on unsuccessful fork() or pipe() call
NOTES: creates a pipe, and performs fork/exec operations using "command"

popen()函数首先调用pipe()函数建立一个管道,然后它用fork()函数建立一个子进程,
运行一个shell 环境,然后在这个shell 环境中运行"command"参数指定的程序。数据在管道
中流向由"type"参数控制。这个参数可以是"r"或者"w",分别代表读和写。需要注意的是,
"r"和"w"两个参数不能同时使用!在Linux 系统中,popen 函数将只使用"type"参数中第一
个字符,也就是说,使用"rw"和"r"作为"type"参数的效果是一样的,管道将只打开成读状态。
使用popen 打开的管道必须用pclose()函数来关闭。还记得fopen 和fclose 的配对使用
吗?这里再次显示了管道和文件的相似性。

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

库函数: pclose();
函数声明: int pclose( FILE *stream );
返回值: exit status of wait4() call
-1 if "stream" is not valid, or if wait4() fails
NOTES: waits on the pipe process to terminate, then closes the stream.

---------------------------------------


注意:管道是在 pclose() 的时候执行 popen() 创建的脚本命令

简单例子
---------------------------------------
// test.c
#include <stdio.h>
#define MAXSTRS 5

int main(void)
{
        int cntr;
        FILE *pipe_fp;
        char *strings[MAXSTRS] = { "roy", "zixia", "gouki","supper", "mmwan"};

        /* 用popen 建立管道 */
        if (( pipe_fp = popen("sort", "w")) == NULL)
        {
                perror("popen");
                exit(1);
        }

        /* Processing loop */
        for(cntr=0; cntr<MAXSTRS; cntr++)
        {
                fputs(strings[cntr], pipe_fp);
                fputc('\n', pipe_fp);
        }

        /* 关闭管道 */
        pclose(pipe_fp);
        return(0);
}

---------------------------------------

编译 cc -o test test.c

执行 ./test
---------------------------------------

使用popen()函数除了节省源代码之外,它还有一个优点:你可以在"command"中使用
任意合法的shell 指令,包括重定向和管道!下面的几个例子都是合法的popen 调用:
popen("ls ~roy", "r");
popen("sort > /tmp/zixia", "w");
popen("sort | uniq | more", "w");
下面是一个稍微复杂一点的例子,在里面建立了两个管道:

稍微复杂的例子
---------------------------------------
// test2.c
#include <stdio.h>

int main(void)
{
        FILE *pipein_fp, *pipeout_fp;
        char readbuf[80];

        /* 用popen 建立一个通向"ls:的读管道 */
        if (( pipein_fp = popen("ls", "r")) == NULL)
        {
            perror("popen");
            exit(1);
        }

        /* 用popen 建立一个通向"sort"的写管道 */
        if (( pipeout_fp = popen("sort", "w")) == NULL)
        {
            perror("popen");
            exit(1);
        }

        /* 进程循环 */
        while(fgets(readbuf, 80, pipein_fp))
            fputs(readbuf, pipeout_fp);
       
    /* 关闭打开的管道 */
        pclose(pipein_fp);
        pclose(pipeout_fp);
        return(0);
}

-----------------------------------------

编译 cc -o test2 test2.c

执行 ./test2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值