3

如果一个 unix 套接字绑定到一个路径,listen()s 并做一些工作,之后它被关闭,套接字“文件”保留在文件系统中。但是,如果我尝试走connect()那条路,我会得到

Connect errno:111
Connection refused

那么“神器”之后还剩下什么?它仍然是一个inode文件系统(我可以用 看到它ls),但它没有绑定,没有监听,我不能cat,否则我得到

cat: /tmp/unix.str: No such device or address

那么剩下的是inode什么?我怎样才能使那个“工件”再次活跃、绑定和监听套接字(删除它,并用该路径创建新的套接字)?

  1. “死”本地套接字的目的是什么(为什么它在关闭后不删除,当它不再使用时)?

  2. 如何恢复“死”套接字?(主要问题)

  3. 谁对错误负责connection refused?不被bind()教育还是不被教育listen()

4

1 回答 1

-1

尝试连接时,您会收到“连接被拒绝”,因为该本地套接字上没有任何内容正在侦听。这就像您尝试连接到 TCP 套接字(如果没有在该端口号上侦听)一样。

一旦打开套接字的程序关闭,该进程就有责任删除带有unlink. 手册页指出:

使用文件名绑定到套接字会在文件系统中创建一个套接字,调用者在不再需要它时必须将其删除(使用 unlink(2))。通常的 UNIX 紧随语义适用;套接字可以随时取消链接,并在最后一个对它的引用关闭时最终从文件系统中删除。

如果程序意外崩溃,这当然可能是一个问题,因此您可以通过另外使用锁定文件来解决这个问题。

另一种选择是使用抽象套接字地址。这是通过将sun_pathin的第一个字节设置sockaddr_un为 0 并将其余字节设置为指定套接字名称的空终止字符串来完成的。例如:

struct sockaddr_un sun;
sun.sun_family = AF_UNIX;
sun.sun_path[0] = 0;
strcpy(sun.sunpath + 1, "mysocketname");

这为您提供了一个命名套接字,而文件系统中没有相应的套接字文件。一旦套接字描述符关闭,该套接字将自动消失,因此可以使用该名称打开另一个套接字。

于 2021-01-29T19:56:44.777 回答