从管道中使用数据的最佳方法是什么?

时间:2013-01-16 07:13:24

标签: 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()?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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