0

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

例如,在 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())更快吗?

4

2 回答 2

2

您确定此操作对您的程序的性能至关重要吗?如果没有,只需使用最简单的东西,可能是类似的东西cat the_pipe > /dev/null或它在 C 中的等价物,循环读取(2)数据块(比如 4KiB,或者可能获得“最佳”大小,在当前 Linux 上)管道中的最大数据为 64KiB;看看 pipe(7))。也许让数据的生产者闭嘴比把它扔掉更容易?在性能方面,这是无法击败的......

于 2013-01-20T03:33:49.793 回答
0

使用该read功能。请参阅此处的手册页 - http://linux.die.net/man/3/read

于 2013-01-16T09:40:00.163 回答