ソケットファイルはどこにありますか? (リンクを解除して削除したいです。)

ソケットファイルはどこにありますか? (リンクを解除して削除したいです。)

UDPソケットを使用するプログラムをデバッグしています。プログラムはソケットを生成しますが、他の問題によりプログラムが中断され、正しく終了できません。したがって、コマンドシェルを閉じると、プロセスは「死んだ」状態になります。次回プログラムを実行すると、ソケットの作成中に「生成:アドレスはすでに使用中です」と表示されるため、このプロセス中にソケットが解放されていないようです。もちろん、コンピュータ(実際にはubuntu 16.04がインストールされている小さなボード)を再起動すると、実験を再開できます。
私はLinuxのすべてがファイルであることを知っているので、どこかにソケットファイルがあるはずです。私はここを読んだ(https://stackoverflow.com/questions/34873151/how-can-i-delete-a-unix-domain-socket-file-when-i-exit-my-application)ソケットの接続を解除して(コマンドを使用してunlink)削除できます。ソケットファイルはどこにあり、ソケットファイル(見つかった場合)に関する情報はどのように取得できますか?

答え1

Googleは「REUSEADDR」(または「SO_REUSEADDR」など)と呼ばれるUDP(およびTCP)ソケットパラメータとREUSEPORT(違いの確認)を提供します。

アプリケーションでUDPソケットを作成するときに「REUSEADDR」を使用すると、ポートにバインドするときにSO_REUSEADDRフラグが設定されます。これは、複数のスレッドまたはプロセスがエラーなしで同じアドレス:ポートにバインドできることを意味します(すべてフラグが設定されている場合)。最後にバインドされたプロセスだけがトラフィックを受信するので、以前のリスナー(あなたの場合は機能しないアプリケーション)から制御を取得します。

サーバーアプリケーションを設計するときにサービスをすばやく再起動できるように、REUSEADDRフラグを設定することをお勧めします。それ以外の場合は、バインディングが成功するのを待ちます。これにより、管理をシステムに委ねる必要があるソケットファイルをハックすることなくアプリケーションを再起動できます。

答え2

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アドレスバインディングを解放するのに十分かどうか疑われます。

関連情報