1. 程式人生 > >popen和pclose詳解及例項

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.f
ilename: 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;
}