C 使用管道中的数据的最佳方式是什么?

C 使用管道中的数据的最佳方式是什么?,c,unix,pipe,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: 如果我关闭整个管道并在每次

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

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

使用
read
函数。
请参阅此处的手册页-

是否确定此操作对程序的性能至关重要?如果没有,就用最简单的方法,可能是类似于C语言的
cat the_pipe>/dev/null
或者它的等价物,一个循环读取一个数据块(比如4KB,或者可能得到一个“最佳”大小,在当前的Linux上,管道中的最大数据是64KiB;看看管道(7))。
也许让数据生产者闭嘴比让数据生产者扔掉更容易些?就性能而言,这是无与伦比的…

管道符合POSIX标准,因此它可以在符合POSIX标准的系统上移植<代码>拼接
是Linux唯一的系统调用。为什么要使用管道中的数据@我只想使用管道中的数据。我正在实现一个服务器,例如,假设有一个传入连接,服务器处理请求并准备所有必要的东西,以便向客户机做出响应,但是发生了一些事情;客户端关闭了连接。此时,服务器无法向客户端做出响应,现在服务器需要从中恢复以处理其他请求。现在,您将如何处理以前由服务器填充的pipefd[0]中的数据?依我看,要么消耗数据,要么关闭管道。事实上,这不是应用程序的瓶颈。最好的办法是像你说的那样使用更大的缓冲区。尽管libevent似乎提供了一个可移植的零拷贝接口,该接口使用主机操作系统提供的低级原语。在我看来,libevent非常有趣。