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

How to use unix domain socket without creating a socket file

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

我必须使用 Unix 域套接字,但我在系统上没有文件 create/write 访问权限。

提前致谢。

您可以使用 "abstract socket address" 创建一个 unix 域套接字。只需将传递给 bindsockaddr_unsun_path 字符串的第一个字符设为 '[=13=]'。在这个初始 NUL 之后,将一个字符串写入 sun_path 的其余部分,并用 NUL(或其他任何东西)将其填充到 UNIX_PATH_MAX

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

有关详细信息,请参阅 unix(7), and specifically the part on abstract socket addresses. A fully worked example can also be found here