gpt4 book ai didi

c - UNIX SOCKET - 可以直接写入套接字的内存吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:48:16 25 4
gpt4 key购买 nike

在我的软件中,我为 IPC 使用了 PF_UNIX 套接字。

到目前为止,我需要通过 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!!

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

有人知道这是否可行吗?

最佳答案

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

进行零复制的唯一方法是使用 vmsplice(2),但套接字并未正式支持它,不建议将其用于除管道以外的任何东西。

如果您确实决定使用 vmsplice,请记住您必须随后以页面 block 的形式提交数据 sysconf(_SC_PAGESIZE)。此外,它是一个仅限 Linux 的系统调用,不可移植。

关于c - UNIX SOCKET - 可以直接写入套接字的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com