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.

popen, pclose - process I/O的更多相关文章

  1. popen&pclose管道方式操作shell命令

    popen, pclose - pipe stream to or from a process FILE *popen( const char *command, const char *type) ...

  2. [apue] popen/pclose 疑点解惑

    问题请看这里: [apue] 使用 popen/pclose 的一点疑问 当时怀疑是pclose关闭了使用完成的管道,因此在pclose之前加一个足够长的sleep,再次观察进程文件列表: 哈哈,这下 ...

  3. [apue] 使用 popen/pclose 的一点疑问

    当我们需要将输出作为标准输入传递给一个命令,或者将一个命令的输出作为标准输入来读取, 一般会想到使用pipe与fork相结合的方式,来重定向标准输入/输出给指定命令. popen/pclose 帮助我 ...

  4. popen pclose 不等待命令执行完毕

    $handle = popen("start D:\\test.bat", "r"); //exec("start D:\\test.bat" ...

  5. Linux popen/pclose

    popen() 函数 #include <stdio.h>FILE * popen(const char *command , const char *type );int pclose( ...

  6. popen()/pclose()阻塞性问题验证

    背景: popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数. pclos ...

  7. popen && pclose函数

    1. 函数操作: 创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止: 2. 函数原型: #include <stdio.h> F ...

  8. 标准管道(popen)

    NAME popen, pclose - pipe stream to or from a process SYNOPSIS #include <stdio.h> FILE *popen( ...

  9. popen的用法及与system调用的区别

    首先用man查看下popen的介绍: popen(3) - Linux man page Name popen, pclose - pipe stream to or from a process S ...

随机推荐

  1. Leetcode 12. Integer to Roman(打表,水)

    12. Integer to Roman Medium Roman numerals are represented by seven different symbols: I, V, X, L, C ...

  2. 记录redis 存放JSON字符串,在并发操作时读-改-写问题

    问题描述: 这里涉及到的问题其实就是普遍的读-改-写,redis可以保证每个操作的原子性,但是无法保证多个操作的原子性,解决的方法可以使用redis提供的multi和watch命令,具体使用如下:1. ...

  3. [CSP-S模拟测试]:打扫卫生(暴力)

    题目描述 有$N$头奶牛,每头那牛都有一个标号$P_i1\leqslant Pi\leqslant M\leqslant N\leqslant 40,000$.现在$Farmer\  John$要把这 ...

  4. [BZOJ2822]:[AHOI2012]树屋阶梯(卡特兰数)

    题目传送门 题目描述 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_5_综合案例_文件上传案例优化

    自定义文件命名 文件名称被写死了 服务器上传了一张图片,服务器就停止了 把服务器端的代码放在while循环里面 服务器也不用 关闭了. 上传完成后服务器端没有关闭 再来启动客户端,又上传一张投片. 多 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_9_Hashtable集合

    是最早期的双列集合 同步就表示是单线程 value也不允许为空

  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_2_一切皆为字节

    这里的视频就是字节的形式,为了看着方便转换成了MB.一个字节就是8个二进制 包括文本,都是以字节的形式存储的

  8. (136)leetcode刷题Python笔记——只出现一次的数字

    题目如下: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  9. from 表单回车自动提交

    自动提交的情况 1 表单只有单个输入框 2 type=‘submit  这里注意button默认type为submit 解决方法 1 添加一个隐藏的输入框 2 form添加属性 onsubmit=&q ...

  10. 洛谷 P2672 推销员(贪心,模拟)

    传送门 解题思路 第一种: 对于选i家,很显然,a值前i-1家的一定会选,所以只需要考虑最后一家的选法.要么是选择a值第i大的(就不管s了),要么选择剩下的中s最大的. 我们把每一家的情况(s和a)存 ...