yuk1ty / learning-systems-programming-in-rust

「Rustでもわかるシステムプログラミング」
430 stars 23 forks source link

4.3 節をリプレースする #30

Closed yuk1ty closed 3 years ago

yuk1ty commented 3 years ago

節タイトル

システムからの通知

対象コード

https://github.com/yurakawa/learn-system-programming-with-go/blob/master/ch4/s3-1/main.go

補足説明

laysakura commented 3 years ago

@yuk1ty やりたいです 🙋‍♀️

yuk1ty commented 3 years ago

お願いします!

ここってちなみに std::sync::mspc::channel 等を駆使すればいけるんですかね。シグナルのハンドリングは外部クレートの signal-hook で対応できるでしょうか。

laysakura commented 3 years ago

まだ腰を据えて取り組んでいないので多分に変わり得ますが:

std::sync::mspc::channel 等を駆使すれば

シグナルハンドリングをchannelを使って行うのはむしろGoが特殊だと思っていて、多くの言語はコールバック関数(の関数ポインタやらクロージャやら)をシグナルハンドラを設定する関数に渡す場合がほとんどだと思います。 Rustでどうやるかは腰を据えたときに考えてみます 🤔

シグナルのハンドリングは外部クレートの signal-hook で

おそらくできると思います!が、自分的には学習用途であんまり外部クレート使いたくないので標準 + 自前実装でできないか検討してみます。

laysakura commented 3 years ago

電車で腰を据えてみました 🚋

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 クレートはめちゃくちゃ重たいので、これを入れるかは悩ましい部分です。 ちょっと寝かせて考えてみます 😴