1

在我的软件中,我为 IPC使用PF_UNIX -socket。

到目前为止,我需要分配一个(预)缓冲区malloc来准备数据,然后再将其写入write缓冲区。

现在我想知道:

socket-fd 已经有一个缓冲区,例如。64kb,那么为什么我不能像这样简单地直接准备并将数据写入该缓冲区:

// stupid example-code, don't copy
void *fd_buffer = get_buffer_of_fd(fd)
fd_buffer[0] = 1
fd_buffer[1] = 2
fd_buffer[2] = 3
memcpy(fd_buffer, 5, 5)
...
commit_buffer_of_fd(fd, xbytes); // xBytes is DYNAMIC and not known until this point!!

如果这是可能的,我可以节省复制到预缓冲区、从预缓冲区写入套接字甚至分配预缓冲区的往返过程。

有没有人知道这是否可能?

4

1 回答 1

0

套接字缓冲区归内核所有,您永远不能写入内核空间。永远不能。安全风险太大。

进行零拷贝的唯一方法是使用vmsplice(2),但它不受套接字官方支持,不建议用于管道以外的任何东西。

如果您决定使用vmsplice,请记住您必须在页面块中提交您的数据sysconf(_SC_PAGESIZE)。它也是一个仅限 Linux 的系统调用,不可移植。

于 2013-09-10T15:27:26.497 回答