unix 域套接字的临时文件

Temporary file for unix domain socket

我为 unix 域套接字创建临时文件。

int fd;
char sf[] = {"/tmp/socket-XXXXXX"};

if ((fd = mkstemp(sf)) == -1)
    exit(SOCKFERR);
close(fd);

Buf 当我将地址分配给套接字时,我需要删除此文件(bind() 函数仅在套接字文件尚不存在的情况下才有效)。

int sfd;
struct sockaddr_un addr;

if ((sfd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
    exit(SOCKERR);  

unlink(sf);
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, 108, sf);   /* 108 is length of add.sun_path */

if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) != 0)
    exit(BINDERR);

如何为 unix 域套接字创建临时文件而不在 bind() 之前删除它?

How can I create temporary file for unix domain socket without removing it before bind()?

这是不可能的。 linux 中的所有内容都是一个文件。 "Socket" 是一个 "socket file"。使用 mkstemp 您可以创建所谓的 "regular file" 或 "normal file".

如果您创建一个常规文件并尝试创建一个具有相同路径的目录,您将收到错误 EEXISTS。你必须远程文件,然后创建一个目录。

当您尝试创建一个与现有常规文件同名的套接字文件时,会发生完全相同的情况 - 该文件已经存在。当您尝试创建符号 link 或硬 link 或 "character device" ("character special file") 或任何其他文件类型时。您必须删除先前存在的文件,然后创建其他文件类型。