c - unix 域套接字的临时文件

标签 c sockets unix-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);

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

最佳答案

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

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

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

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

关于c - unix 域套接字的临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55682842/

相关文章:

c - 如何在 Linux 上使用 C 检查堆栈和堆的使用情况?

C 中 deque 可以存储 char* 吗?

python - 一种在 C 中模拟命名参数的方法

javascript - 如何使用客户端 JavaScript 向具有特定端口的服务器发送请求?

linux - 无法从 unix 域套接字获取可用字节

c - 调度贪心选择 p‌r‌o‌b‌l‌e‌m

java - 丢失的套接字消息

c# - 在处理 HTTP 客户端时如何知道何时关闭套接字?

c - 使用 select() 阻塞,直到获得或失去客户

python:如何从新进程关闭孤立的域套接字