POPEN - Linux手册页
Linux程序员手册 第3部分
更新日期: 2017-09-15
名称
popen,pclose-管道往返于流程
语法
#include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
popen(),pclose():
- _POSIX_C_SOURCE>= 2 || / * Glibc版本
说明
popen()函数通过创建管道,分叉和调用外壳程序来打开进程。由于管道按定义是单向的,因此type参数可以仅指定读取或写入,不能同时指定两者。生成的流相应地为只读或仅写。
command参数是一个指向以空字符结尾的字符串的指针,该字符串包含一个shell命令行。使用-c标志将该命令传递给/ bin / sh;解释(如果有)由外壳执行。
类型实参是一个以空字符结尾的字符串的指针,该字符串必须包含用于读取的字母aqraq或用于写入的字母aqwaq。从glibc 2.9开始,此参数可以另外包含字母aqeaq,这会导致在基础文件描述符上设置"执行时关闭"标志(FD_CLOEXEC)。请参阅open(2)中O_CLOEXEC标志的说明,以了解可能有用的原因。
从所有方面来看,popen()的返回值都是普通的标准I / O流,但必须使用pclose()而不是fclose(3)将其关闭。写入这样的流将写入命令的标准输入。该命令的标准输出与调用popen()的过程的输出相同,除非由命令本身对其进行了更改。相反,从流中读取将读取命令的标准输出,并且命令的标准输入与调用popen()的过程的输入相同。
请注意,默认情况下,输出popen()流是块缓冲的。
pclose()函数等待关联的进程终止,并返回由wait4(2)返回的命令的退出状态。
返回值
popen():成功后,返回指向开放流的指针,该指针可用于读取或写入管道;如果fork(2)或pipe(2)调用失败,或者该函数无法分配内存,则返回NULL。
pclose():成功后,返回命令的退出状态;如果wait4(2)返回错误,或检测到其他错误,则返回-1。
发生错误时,这两个函数都会将errno设置为适当的值。
错误说明
如果内存分配失败,popen()函数不会设置errno。如果基础的fork(2)或pipe(2)失败,则会正确设置errno。如果type参数无效,并且检测到此情况,则将errno设置为EINVAL。
如果pclose()无法获得子状态,则将errno设置为ECHILD。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
popen(),pclose() | Thread safety | MT-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008。
type的aqeaq值是Linux扩展。
备注
注意:请仔细阅读system(3)中的警告。
BUGS
由于打开的用于读取的命令的标准输入与名为popen()的进程共享其寻道偏移量,因此,如果原始进程已进行了缓冲读取,则该命令的输入位置可能与预期的不同。同样,打开的用于写入的命令的输出可能会与原始过程的输出混合在一起。通过在popen()之前调用fflush(3)可以避免后者。
无法执行外壳程序与外壳程序无法执行命令或命令立即退出没有区别。唯一的提示是退出状态为127。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。