Linux
我在哪裡可以找到套接字文件?(我想取消連結並刪除它..)
我正在調試一個使用 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 標誌,以允許快速重新啟動服務,否則您就坐等綁定成功。這將允許您重新啟動您的應用程序,而不必破解應該留給系統管理的套接字文件。