Closed yuk1ty closed 3 years ago
@yuk1ty やりたいです 🙋♀️
お願いします!
ここってちなみに std::sync::mspc::channel 等を駆使すればいけるんですかね。シグナルのハンドリングは外部クレートの signal-hook で対応できるでしょうか。
まだ腰を据えて取り組んでいないので多分に変わり得ますが:
std::sync::mspc::channel 等を駆使すれば
シグナルハンドリングをchannelを使って行うのはむしろGoが特殊だと思っていて、多くの言語はコールバック関数(の関数ポインタやらクロージャやら)をシグナルハンドラを設定する関数に渡す場合がほとんどだと思います。 Rustでどうやるかは腰を据えたときに考えてみます 🤔
シグナルのハンドリングは外部クレートの signal-hook で
おそらくできると思います!が、自分的には学習用途であんまり外部クレート使いたくないので標準 + 自前実装でできないか検討してみます。
電車で腰を据えてみました 🚋
Rustは標準ライブラリでシグナルハンドリングのサポートを何もしていないですね 🙄
自前実装をするなら libc
クレートを通して signal(3)
を叩いたりする必要があります。
教えていただいた signal-hook はもっと洗練されたことをやっていて、self-pipe を使ってシグナルハンドリングをしています。 https://github.com/vorner/signal-hook/blob/b08e6cf55f552e7e852c70a23620574641c281f2/src/low_level/pipe.rs#L173
signal-hook がよくできているのは「複数のライブラリクレートが signal-hook クレートを使っても、それぞれのライブラリクレートが登録したシグナルハンドラがrace conditionに陥らず全て実行される」ようにしている部分です。 この辺を実装すると signal-hook と同じ規模になり死んでしまいますが、自分で書いた main() から使うだけのシグナルハンドリング程度なら自前実装は可能そうです。
一方で libc
クレートはめちゃくちゃ重たいので、これを入れるかは悩ましい部分です。
ちょっと寝かせて考えてみます 😴
節タイトル
システムからの通知
対象コード
https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s3-1/main.go
補足説明