Linux

我在哪裡可以找到套接字文件?(我想取消連結並刪除它..)

  • November 25, 2020

我正在調試一個使用 UDP 套接字的程序。該程序創建了一個套接字,但之後由於其他一些問題,程序卡住了,我無法正確殺死它。所以我關閉命令外殼,程序進入“失效”狀態。我猜在這個過程中套接字還沒有被釋放,因為下次我執行程序時,在套接字創建過程中,它說“創建:地址已在使用中”。當然,如果我重新啟動電腦(實際上是一個小板,安裝了 ubuntu 16.04)我可以重新開始實驗。

我知道linux中的一切都是文件,所以應該在某個地方有套接字文件。我在這裡讀過(https://stackoverflow.unlink) 並將其刪除。我在哪裡可以找到套接字文件以及如何獲取有關套接字文件的資訊(找到它之後)?

我認為lsof -iUDP這是您正在尋找的:

$ sudo lsof -iUDP
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae  726    avahi   12u  IPv4  21843      0t0  UDP *:mdns 
avahi-dae  726    avahi   13u  IPv6  21844      0t0  UDP *:mdns 
avahi-dae  726    avahi   14u  IPv4  21845      0t0  UDP *:46374 
avahi-dae  726    avahi   15u  IPv6  21846      0t0  UDP *:34483 
NetworkMa  732     root   23u  IPv4  32835      0t0  UDP stewbian:bootpc->_gateway:bootps 
postgres   848 postgres    8u  IPv6  21908      0t0  UDP localhost:58947->localhost:58947 
postgres   849 postgres    8u  IPv6  21916      0t0  UDP localhost:35817->localhost:35817 
postgres   850 postgres    8u  IPv6  21912      0t0  UDP localhost:40321->localhost:40321 
postgres   858 postgres    8u  IPv6  21908      0t0  UDP localhost:58947->localhost:58947 
postgres   859 postgres    8u  IPv6  21908      0t0  UDP localhost:58947->localhost:58947 
postgres   860 postgres    8u  IPv6  21908      0t0  UDP localhost:58947->localhost:58947 
postgres   861 postgres    8u  IPv6  21908      0t0  UDP localhost:58947->localhost:58947 
postgres   865 postgres    8u  IPv6  21912      0t0  UDP localhost:40321->localhost:40321    0t0  UDP localhost:35817->localhost:35817 
postgres   877 postgres    8u  IPv6  21916      0t0  UDP localhost:35817->localhost:35817 
cups-brow 5729     root    7u  IPv4 153431      0t0  UDP *:631 

您可以看到您有 PID 和程序名稱。我懷疑這足以kill $PID解除綁定地址。

有一個名為“REUSEADDR”(或“SO_REUSEADDR”等)的 UDP(和 TCP)套接字參數以及 REUSEPORT(以查看差異)的 Google。

如果您在應用程序中創建 UDP 套接字時使用“REUSEADDR”,則綁定到埠時將設置 SO_REUSEADDR 標誌。這意味著多個執行緒或程序可以綁定到同一個地址:埠而不會出錯(前提是它們都設置了標誌)。請注意,只有最後一個綁定的程序才會接收流量,並從前一個偵聽器(在您的情況下為死應用程序)取得控制權。

在設計伺服器應用程序時,最好設置 REUSEADDR 標誌,以允許快速重新啟動服務,否則您就坐等綁定成功。這將允許您重新啟動您的應用程序,而不必破解應該留給系統管理的套接字文件。

引用自:https://unix.stackexchange.com/questions/621467