linux 管道溢出问题分析

版权声明:转载请注明出处 https://blog.csdn.net/u010659887/article/details/80319545

由于项目中的线程间通讯使用到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 的优化也很重要。

猜你喜欢

转载自blog.csdn.net/u010659887/article/details/80319545