在 CentOS 上增加管道内部缓冲区大小

Posted

技术标签:

【中文标题】在 CentOS 上增加管道内部缓冲区大小【英文标题】:Increase pipe internal buffer size on CentOS 【发布时间】:2012-04-29 21:34:22 【问题描述】:

我正在使用异步管道进行进程间通信(为了简化,我删除了错误检查)

int pipe_fd[2];
pipe(pipe_fd);
int fdflags = fcntl(pipe_fd[1], F_GETFL, 0);
fdflags |= O_NONBLOCK;
fcntl(pipe_fd[1], F_SETFL, fdflags);

我正在寻找一种增加管道内部缓冲区大小的方法。 我知道可以使用 Kernel >= 2.6.35 通过以下方式:

fcntl(fd, F_SETPIPE_SZ, size);

或写信至:

/proc/sys/fs/pipe-max-size

但我正在使用内核 2.6.18 开发 CentOS 5。 是否可以使用 Kernel 2.6.18 增加管道内部缓冲区大小?如果是,该怎么做?

【问题讨论】:

【参考方案1】:

在 CentoS 5 的内核上,管道固定为 64 KB

【讨论】:

【参考方案2】:

除非您只想在 C 代码中执行此操作,否则一种选择是在设置限制后运行程序的包装器 shell 脚本中使用 ulimit -p。

【讨论】:

-p The pipe size in 512-byte blocks (this may not be set)。此外,ulimit 显示的值是保证写入是原子的最大大小。在 CentoS 5 的内核上,管道固定为 64 KB。 事实上我想知道shell是如何做到这一点的。我猜“可能未设置”涵盖了操作系统不支持更改管道大小的情况。 好的,我将重新编译内核以更改管道大小【参考方案3】:
/proc/sys/fs/pipe-max-size sets the limit for fcntl F_SETPIPE_SZ

只是改变/proc/sys/fs/pipe-max-size 没有区别 ulimit -p 也没用

你必须实际使用fcntl F_SETPIPE_SZ

据我所见pipe-max-size 默认为 1MB,对于任何疯狂的管道需求来说应该绰绰有余

【讨论】:

能否修改 /proc/sys/fs/pipe-max-size 以将最大管道限制增加到 1MB 以上?我有一个疯狂的需求,我需要它大于 1MB :)

以上是关于在 CentOS 上增加管道内部缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?

管道的原子性 linux写操作原子性

如何限制管道(windows)的缓冲区大小?

用 Linux 管道实现 online judge 的交互题功能

linux IPC机制学习博客

如何在 Oracle SQL Developer 中增加缓冲区大小以查看所有记录?