生涯未熟

生涯未熟

プログラミングをちょこちょこと。

【Go】Unixドメインソケットでのinterruptを使った終了処理

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