linux 管道溢出问题分析

由于项目中的线程间通讯使用到libuv中的pipe,由于libuv的高性能异步结构,数据传输速度很快。为了方便数据解析试用了结构体,比如:

typedef struct A{  

  a[1024*10];  

};  

可以看到一个数据包有10kb,在系统中查看系统管道大小:


pipe_buf 大小:512*8 = 4kb,那岂不是一个包就溢出了,然而还有一个pipe最大容量,man 7 pipe 查看:


最大容量是 65536 bytes = 64kb

接下来,如果pipe write线程的写的比较快,或者pipe read线程由于某个处理耗时长,导致管道里有6个数据包没有取出,再往里写就会提示resource temporarilly unvailable,甚至出现段错误。

这个问题解决也容易,pipe wirte 速度 < pipe read速度即可,这样就不会溢出了,pipe read 的优化也很重要。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,465评论 11 349
  • Android跨进程通信IPC整体内容如下 1、Android跨进程通信IPC之1——Linux基础2、Andro...
    隔壁老李头阅读 15,882评论 19 113
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,048评论 0 4
  • 心中尚有未了的战争在咆哮, 蜂拥而入冲击着沉重的头颅, 造就我们 毁灭我们 留下伤痕, 大人做出的决定有时伤害人心...
    余忆桐阅读 1,534评论 1 2
  • 不知道啥时候,开始养成了喜欢买书的习惯,也偶尔翻书的习惯。闲来无事,都喜欢不自觉的去翻翻。觉得反正觉得无聊,不如给...
    梦鹿是一只猫阅读 2,854评论 0 2