通常我们在使用管道的时候,如果忘记关掉输入或输出,就会出现SIGEPIPE,或者block的现象。为了能够更加方便的使用管道,可以使用popen()函数来建立管道。
#include<stdio.h>
FILE *popen(const char *command, const char*mode);
#RETURN file stream, or NULL on error
int pclose(FILE *stream);
#RETURN termination status of child process or -1 on error
popen()函数的大概流程如下:
- 创建管道
- 创建一个子进程来执行shell,而shell又创建一个子进程来执行字符串。
- mode是字符串,用来判断这是进管道®还是出管道(w)
popen()在成功时会返回stdio库使用的文件流指针(FILE *),发生错误返回NULL。调用popen()之后,调用进程来读取command的输出或者使用管道向其发送输入。这个地方就是比pipe()函数更加对用户友好的地方。如果是使用pipe()函数的话,每次使用完都需要pclose,要不然就因为缓存溢出之后发生阻隔,要么就是完全写不进去。popen()在用完管道之后,会自动关闭,减少了很多bug。