Closed8
Rustからシステムコール(libc)を呼ぶ時のエラーハンドリング

Rustはシステムプログラミング言語なのでシステムコールを呼ぶ時にCとの言語仕様の差異をどう埋めるかが結構重要な気がしている。
特に例外処理はシステムコールを呼ぶときにほぼ必ずやることになるが、Cの例外処理は(Cに詳しくない)自分からするとかなり特殊でクセが強く、エラーハンドリングをResult
でやるRustとの差異をどう埋めるかは悩ましい問題に見える。
std::net
のソースとかを深掘りするとどうやっているかはわかるのだが、その割にちゃんとまとめている記事がなさそうなので自分でまとめてみる。

どうでもいいけどSocket周りのソースはRustの書き方のコツが詰まってるので読むととても勉強になる。自分のRustの理解はほぼこれを読んだ経験からきてる、気がする。

まずは本家Rustのソースを読もう。branchは安定版のstableで読む。
Rustのソースを手元で読むときは、rust-analyzer動かすためにちゃんとbuildすること
build方法はこの辺りを読めばわかる

(脱線)Rust本家だとtraitのimplでmock作ってテストしてるんだな、そりゃそうか

#[should_panic]
なんてあるのね、おもしろ
てか普通にあった

本題の話全然大したことなかった
エラーの時にio::Error::last_os_error()
でerrorno
を返すのでこれを使うだけ
例えばこんな感じ
let ret = unsafe { libc::flock(file.as_raw_fd(), operation) };
if ret == -1 { Err(io::Error::last_os_error()) } else { Ok(Lock { _file: file }) }
実際の実装だとこうやってる

何回も書くのめんどくさいからこんなふうに共通化されてたりもする

macro使って複数の値を一気にimplするのは時々見る手法
このスクラップは2023/12/23にクローズされました