c - 从管道消费数据的最佳方式是什么?

标签 c unix pipe

我对更便携且最快的方式来使用管道中的数据感兴趣。

例如,在linux中我能想到的最快的方法如下:

#define _GNU_SOURCE
/* ... */
int fd;
int pipefd[2];

pipe(pipefd);

/* ... */
fd = open("/dev/null", O_WRONLY);
splice(pipefd[0], NULL, fd, NULL, INT_MAX, SPLICE_F_MOVE);

...但它不可移植。

更新1:

如果我关闭整个管道并在每次需要时创建一个管道会怎样?

/*consume*/
close(pipefd[0]);
close(pipefd[1]);

它会比使用其他方法(即 read()/write())更快吗?

最佳答案

您确定此操作对您的程序性能至关重要吗?如果没有,只需使用最简单的可行方法,可能是 cat the_pipe >/dev/null 或 C 中的等效项,循环读取(2)数据 block (例如 4KiB ,或者也许得到一个“最佳”大小,在当前的 Linux 上,管道中的最大数据是 64KiB;看看 pipeline(7))。 也许让数据生产者闭嘴比得到数据然后扔掉更容易?在性能方面,这是无与伦比的......

关于c - 从管道消费数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14353064/

相关文章:

c - 结构 sigaction 不完整错误

c - 在 C 中实现管道时出现错误的文件描述符错误

macos - 如何复制在 OSX 上使用 grep 找到的文件

php - strtotime ('today' ) 返回不正确的时间?

c - 如何使用手册 2 页中列出的系统调用从 uid 和 gid 中查找所有者和组名?

shell - 管道中变量的范围

c - 为什么我收到段错误 : 11 on the program below

c - 符号扩展至 16 位

c - 了解 C 中的字符串赋值

regex - awk:如果不为零则替换第二列