我对更便携且最快的方式来使用管道中的数据感兴趣。
例如,在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/