对于Unix系统编程中管道通信函数popen()的理解

通常我们在使用管道的时候,如果忘记关掉输入或输出,就会出现SIGEPIPE,或者block的现象。为了能够更加方便的使用管道,可以使用popen()函数来建立管道。

#include

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。

你可能感兴趣的:(unix,linux)