POPEN(3)

NAME
popen, pclose - process I/O

SYNOPSIS
#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

描述
popen() 函数 用 创建管道 的 方式 启动 一个 进程, 并调用 shell. 因为 管道 是被定义成 单向的, 所以 type 参数 只能 定义成 只读 或者 只写, 不能是 两者同时, 结果流 也相应的 是 只读 或者 只写.

command 参数 是 一个 字符串指针, 指向的 是 一个 以 null 结束符 结尾的字符串, 这个 字符串 包含 一个 shell 命令. 这个命令 被送到 /bin/sh 以 -c 参数 执行, 即由 shell 来执行. type 参数 也是 一个 指向 以 null 结束符 结尾的 字符串的指针, 这个字符串 必须是 'r' 或者 'w’ 来指明 是 读还是写.

popen() 函数 的 返回值 是 一个 普通的 标准I/O流, 它只能用 pclose() 函数 来关闭, 而不是 fclose(). 函数. 向 这个流 的 写入 被转化为 对 command 命令的 标准输入; 而 command 命令的 标准输出 则是和 调用 popen(), 函数 的 进程 相同，除非 这个 被command命令 自己 改变. 相反的, 读取 一个 “被popen了的” 流, 就相当于 读取 command 命令的 标准输出, 而 command 的 标准输入 则是和 调用 popen, 函数的 进程 相同.

注意, popen 函数的 输出流 默认是 被全缓冲的.

pclose 函数 等待 相关的进程 结束 并返回 一个 command 命令的 退出状态, 就像 wait4 函数 一样.

返回值
如果 fork(2) 或者 pipe(2) 调用 失败, 或者 它 分配不到内存, popen 函数 返回 NULL .

如果 wait4 返回 一个 错误, 或者 其他什么 错误 发生, pclose 函数 返回 一个 -1.

错误
如果 内存空间 开辟 失败, popen 函数 并不设置 errno . 如果 内部的 fork() 函数 或者 pipe() 函数 失败, errno 则会被 适当的 设置. 如果 type 参数 是不可用的, 而且 这个 状态 被侦测到, errno 将 被设置成 EINVAL.

如果 pclose() 函数 不能 侦测到 子进程的状态, errno 将 被设置成 ECHILD.

适应环境
POSIX.2

BUGS
因为 command 命令 读取的 标准输入 和 调用 popen() 函数 的 进程 共享 一个 “搜索偏移量”, 所以, 如果 原进程 已经 完成了 一个 缓冲的读取, 那么 command 命令的 输入位置 将是 不可预料的. 相似的, command 命令的 输出 会和 原进程的输出 混杂在一起. 后者 可以 在调用 popen. 函数前 调用 fflush(3) 函数 来避免.

如果 这个 shell 执行 失败, 将不能 辨别出 这个错误 是由 shell 运行 这个 command 命令 失败, 还是 command 命令 立即退出 引起的. 唯一的 一个 “线索”, 就是 127 这个 退出状态.

历史
popen() 函数和 pclose() 函数 (第一次) 出现在 Version 7 AT&T UNIX.

参考
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3), fopen(3), stdio(3), system(3)

TRANSBY
LinuxForum.Net CMPP 中文手册页计划 http://cmpp.linuxforum.net

* Sun Oct 10 2004 aero <yangwl@neusoft.com>
- 翻译 若有 错误 或者 不足, 请与我联系。若可以, 在此留下 我女朋友的 名字 温婷婷 :)