popen和pclose详解及实例

    popen函数是标准c提供的一个管道创建函数,其内部操作主
要是创建一个管道,调用fork创建子进程,关闭不需用的文件描述符,调用exec函数族执行popen的第一个参数。然后等到关闭。
也就是说我们可以传递一个命令(ls -l......)或一个可执行程序。于pipe对比来说代码相对少很多。

**************************************************
相关函数:
     #include <stdio.h>

     FILE *popen(const char *command, const char *type);
                    1.command:shell命令或可执行程序名
                    2.type打开方式,可类比fopen函数
                返回值:成功返回文件指针,失败返回NULL
     int pclose(FILE *stream);
                返回值:成功返回command终止状态,失败返回-1
**************************************************
实例:
    实现从终端得到字符并将大写转换为小写输出。

分析:
    编写一个程序实现从终端得到字符并处理过滤后写入标准输出,
    然后编译成可执行文件。在另一个程序调用popen去执行这个可执行程序。并从文件流中读取数据

代码:

1.filename: popen_filter.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


#define MAXLINE 1024

int main(void)
{
    FILE *fpin = NULL;
    char line[MAXLINE];

    if ((fpin = popen("./filter", "r")) == NULL) {
        perror("popen error");
        return EXIT_FAILURE;
    }

    for (; ;) {
        fputs("prompt> ", stdout);
        fflush(stdout);

        if (fgets(line, MAXLINE, fpin) != NULL) {
            if (fputs(line, stdout) == EOF) {
                perror("fputs error");
                return EXIT_FAILURE;
            }
        } else {
            break;
        }

    }

    if (pclose(fpin) == -1) {
        perror("pclose error");
        return EXIT_FAILURE;
    }

    putchar('\n');

    return EXIT_SUCCESS;
}
2.filename: filter.c

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
    char c;

    while ((c = getchar()) != EOF) {
        if (isupper(c)) {
            c = tolower(c);
        }

        if (putchar(c) == EOF) {
            perror("output error");
        }

        if (c == '\n') {
            fflush(stdout);
        }
    }

    return EXIT_SUCCESS;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章