popen和pclose詳解及例項
阿新 • • 發佈:2019-02-16
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;
}