GoでUnixドメインソケットを組んでいる時に、掲題が疑問だったので調べてみました。
Why?
最初このようなListenerのコードを書いていました。
単純に net.Listen
で /tmp/connection.sock
をlistenして、 listener.Accept
でコネクションを待ち受けているという非常に簡単なコードです。
で、このプログラムを普通に動かしてSIGINT Signal で割り込みすると、本来削除されるべきsocketファイルが存在したままとなり、再度プログラムを動かすとエラーとなります。
これをどうにかしたかったのですが、 listener.Accept
で待ち受けている状態で、どうやったら signal.Notify
で受け取ったシグナルを元にプログラムを終了させるのか、パッと考えつきませんでした。
How
インターネットをふらついていると、以下のようなコード片を発見しました。
golang unix domain socket · GitHub
このコード片の server.go
にお目当てのコードがありました。
どういうことかというと、メインのスレッドは listener.Accept
で待ち受けておいて、goroutineで作った新しいスレッドでSIGINT Signalをキャッチして、プログラムを終了させるという流れです。
goroutineのスレッド側でSignalをキャッチする、というのがちょっと思いつきませんでした。