【问题标题】:can I delete abstract socket path?我可以删除抽象套接字路径吗?
【发布时间】:2015-02-19 06:37:29
【问题描述】:

我创建了一个抽象套接字。

#define SOCKET_PATH @/tmp/xyz /*in server code of socket_server.c*/

int sockfd = -1; 
int len; 
struct sockaddr_un address; 
int result; 
sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 
if(sockfd < -1) { 
    perror("socket:"); 
} 
memset(&address, 0, sizeof(address)); 
address.sun_family = AF_UNIX; 
strcpy(address.sun_path, SOCKET_PATH); 
address.sun_path[0]='\0'; 
len = sizeof(address); 
result = connect(sockfd, (struct sockaddr*)&address, len); 

正在成功创建抽象套接字

sh-3.2# netstat -a | grep xyz
unix  2      [ ACC ]     STREAM     LISTENING     11132  @/tmp/xyz

现在我正在使用相同的文件路径来取消链接套接字。

#include<stdio.h>
#define SOCKET_PATH "@/tmp/xyz"
int main()
{
        int ret;
        ret = unlink(SOCKET_PATH);
        if(ret == -1)
                perror("unlink::");
        return 0;
}

但是当我运行我的取消链接代码时,我收到的消息是:

sh-3.2# ./ulink
unlink::: No such file or directory

有人能告诉我这个“没有这样的文件或目录”的原因吗?我怎样才能从外部删除/取消链接这个抽象套接字?有没有什么方法?

【问题讨论】:

  • 检查 /tmp/xyz,不带 @,并显示调用 socket() 函数的代码
  • 我试过 /tmp/xyz 并且消息是一样的,我的 socket() 函数 sn-p: int sockfd = -1;国际化; struct sockaddr_un 地址;整数结果; sockfd = 套接字(AF_UNIX,SOCK_STREAM,0); if(sockfd
  • 有些东西没有加起来。服务器套接字在哪里? listen 在哪里? bind 在哪里?您的套接字连接到什么?
  • 无论如何,抽象套接字与文件系统没有任何关联(这就是它们抽象的原因)。你不能用文件系统操作来操作它们。

标签: linux sockets network-programming


【解决方案1】:

抽象套接字与文件系统路径名没有任何联系(请参阅unix(7)),因此您不能使用 unlink()。

当没有进程使用抽象套接字时,内核应该自动删除它,所以要“删除”它,你应该关闭所有引用套接字的服务器和客户端描述符,或者干脆杀死所有服务器和客户端进程。

【讨论】:

  • 试一试会有什么结果?换句话说,如果你使用一个创建标准 Unix 套接字文件描述符的现有服务器并用 Linux 命名空间套接字切换它,你是否必须删除 unlink 调用?
  • @JSON unlink 将返回 ENOENT,因为路径 "" 不存在。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2021-07-10
相关资源
最近更新 更多