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

本文介绍了如何避免在使用管道时出现SIGPIPE问题,通过popen函数创建管道并执行命令,它提供了一种更友好的方式,自动管理子进程和管道关闭,减少因缓存溢出导致的bug。
摘要由CSDN通过智能技术生成

通常我们在使用管道的时候,如果忘记关掉输入或输出,就会出现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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值