UNIX网络编程卷2进程间通信读书笔记(二)—管道 (2)

    技术2022-05-11  12

    3

    名称:

    pclose

    功能:

    process I/O

    头文件:

    #include <stdio.h>

    函数原形:

    int pclose(FILE *fp);

    参数:

    fp 标准I/O流

    返回值:

    cmdstring的终止状态,若出错则为-1

     

     

     

     

     

     

     

     

    pclose函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。

     

    下面就是利用这两个函数,把从文件中读入的数据送至分页程序。

    /*14_2.c*/

    #include <stdio.h>

    #include <sys/wait.h>

    #include <stdlib.h>

     

    #define PAGER “${PAGER:-more}”

    #define MAXLINE 10000

     

    int main(int argc,char *argv[])

    {

    char line[MAXLINE];

    FILE *fpin,*fpout;

     

    if((fpin=fopen(argv[1],”r”))==NULL) /*打开文件*/

        perror(“fopen error”);

    if((fout=popen(PAGER,”w”))==NULL) /*创建子进程,然后运行PAGER分页程序,并使fout流连接到分页程序(PAGER)的标准输入*/

        perror(“popen error”);

    while(fgets(line,MAXLINE,fpin)!=NULL) /*argc[1]文件读数据,一次读一行,存入line缓冲区*/

    {

        if(fputs(line,fpout)==EOF) /*把从缓冲区读入的数据写入管道,通过管道输入到分页程序(PAGER)的标准输入*/

            perror(“fputs error”);

    }

    if(pclose(fpout)== -1)

        perror(“pclose error”);

    exit(0);

    }

           程序从先文件读数据,把读的数据存入缓冲区,然后创建子进程,让子进程创建管道并使管道的一端连接到分页程序的标准输入。最后父进程把缓冲区的数据写入管道的另一端,从而实现了输出从定向的功能。

     

           popen特别适用于构造简单的过滤程序,它变换运行命令的输入或输出。使用popen,可以在应用程序和输入之间插入一个程序以便对输入进行变换处理。下面的程序是一个简单的过滤程序,它只是将标准输入复制到标准输出,在复制时将所有大写字符变换为小写字符。在写了一行之后,对标准输出进行了冲洗。

     

    /*14_3.c 过滤程序*/

    #include <ctype.h>

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    int c;

    while((c=getchar())!=EOF) /*获得字符*/

    {

        if(isupper(c)) /*判断是否是大写字母*/

            c=tolower(c)); /*把大写字符转化为小写*/

        if(putchar(c)=EOF) /*输出转换后的字母*/

            perror(“output error”);

        if(c==’/n’)

            fflush(stdout); /*将缓冲区的数据输入到标准输出*/

    }

    exit(0);

    }

    先编译它,然后我们在下面的程序用popen调用它。可能大家不明白上面的几个函数,我简要介绍一下.

    int isupper(int c);ch是大写字母('A'-'Z')返回非0,否则返回0

    int tolower(int c);如果c为大写英文字母,则返回对应的小写字母;否则返回原来的值.

    int fflush( FILE *stream ); fflush 是用来将流清空的函数,如果流跟文件绑定为输出的模式, 那么将会把流中的内容写入文件。

     

    /*14_4.c*/

    #include <stdio.h>

    #include <stdlib.h>

    #include <sys/wait.h>

    #define MAXLINE 100

     

    int main(void)

    {

    char line[MAXLINE];

    FILE *fpin;

     

    if((fpin=popen(“./14_3”, “r”))==NULL) /*打开过滤程序*/

        perror(“popen error”);

    for( ; ; )

    {

        fputs(“prompt> “,stdout); /*输出提示信息*/

        fflush(stdout); /*刷新缓冲区*/

        if(fgets(line,MAXLINE,fpin)==NULL) /*从标准输入读数据存放到缓冲区中*/

            break;

        if(fputs(line,stdout)==EOF) /*把缓冲区数据写到标准输出(屏幕)。

            perror(“fput error”);

    }

    if(fclose(fpin)== -1)

        perror(“pclose error”);

    putchar(‘/n’);

    exit(0);

    }

           上面的两个程序要在一个文件夹下运行,程序会把用户输入的大写字母转换为小写。我们经常用popen/pclose处理输入和输出,使他们格式统一。方便程序处理。


    最新回复(0)