popen和pclose详解及实例

时间:2022-11-25 05:50:03
 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;
}