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をキャッチする、というのがちょっと思いつきませんでした。