linux - 如何在不创建套接字文件的情况下使用 unix 域套接字

标签 linux sockets unix-socket

在 Linux 中,有没有使用 AF_LOCAL(unix domain sockets)在不使用文件的情况下在进程(IPC)之间进行通信的例子? (在只读文件系统上)

我必须使用 Unix 域套接字,但我没有在系统上创建/写入文件的权限。

提前谢谢你。

最佳答案

您可以使用“抽象套接字地址”创建一个 unix 域套接字。只需将传递给 bindsockaddr_un 中的 sun_path 字符串的第一个字符设置为 '\0'。在这个初始 NUL 之后,将一个字符串写入 sun_path 的其余部分,并用 NUL(或其他任何内容)将其填充到 UNIX_PATH_MAX

以这种方式创建的套接字将没有任何文件系统条目,而是将被放置在一个不可见的系统范围套接字命名空间中。套接字名称​​不是以空字符结尾的字符串;它是以 NUL 开头的 UNIX_PATH_MAX 长度字符串,任何其他 NUL 都没有特殊意义。因此,填充该名称非常重要,否则您会将额外的未初始化内存垃圾放入该名称中,从而产生意想不到的结果。按照惯例,这通常是使用 NUL 垫完成的,但这取决于您。

更多信息,请咨询unix(7) ,特别是关于抽象套接字地址的部分。还可以找到一个完整的示例 here .

关于linux - 如何在不创建套接字文件的情况下使用 unix 域套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427769/

相关文章:

Java对json格式的限制

c - SOCK_SEQPACKET Unix 套接字上的空数据包

linux - 转换列模式

php - 无法在 Linux 上安装 OAuth

java - Netty socket.shutdownOutput() 等同于避免 TCP RST?

java - 将捕获的图像从 Java 发送到 Android 时出错

c - 来自 C 中 sendto() 套接字程序的无效参数

收听 unix 套接字时检查发件人

c++ - 如何在 C++ 中读取一堆字符串?

c - 在 C 中获取跨平台的时区列表