Closed8

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

フラワーフラワー

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

フラワーフラワー

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

フラワーフラワー

本題の話全然大したことなかった
エラーの時にio::Error::last_os_error()errornoを返すのでこれを使うだけ
https://doc.rust-lang.org/std/io/struct.Error.html#method.last_os_error

例えばこんな感じ

        let ret = unsafe { libc::flock(file.as_raw_fd(), operation) };
        if ret == -1 { Err(io::Error::last_os_error()) } else { Ok(Lock { _file: file }) }

実際の実装だとこうやってる
https://github.com/rust-lang/rust/blob/c03d978a4bcb7c01d8cdf80bd7600b27e2d21588/compiler/rustc_data_structures/src/flock/linux.rs#L25

このスクラップは2023/12/23にクローズされました