Unix域套接字的临时文件

时间:2019-04-15 05:03:06

标签: c sockets unix-socket

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

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

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

当我将地址分配给套接字时,我需要删除此文件(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);

如何在不bind()之前删除UNIX域套接字的情况下创建临时文件?

1 个答案:

答案 0 :(得分:1)

  

如何在unix域套接字之前创建临时文件而不将其删除?

不可能。 linux中的所有内容都是文件。 “套接字”是“套接字文件”。使用mkstemp,您可以创建所谓的“常规文件”或“普通文件”。

如果创建常规文件并尝试使用相同的路径创建目录,则会收到错误EEXISTS。您必须远程文件,然后创建目录。

当您尝试创建与现有常规文件同名的套接字文件时,情况完全相同-该文件已存在于此文件中。当您尝试创建符号链接或硬链接或“字符设备”(“字符特殊文件”)或任何其他文件类型时。您必须删除现有文件,然后创建其他文件类型。