Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

10.2 節をリプレースする #78

Closed
yuk1ty opened this issue May 10, 2021 · 10 comments · Fixed by #80
Closed

10.2 節をリプレースする #78

yuk1ty opened this issue May 10, 2021 · 10 comments · Fixed by #80
Assignees
Labels
10章 ファイルシステムの最深部を扱う Go 言語の関数 コメントを募集 ディスカッションが必要で、コメントを募集しています 実装追加 新しく実装を追加するラベルです

Comments

@yuk1ty
Copy link
Owner

yuk1ty commented May 10, 2021

節タイトル

ファイルのロック

対象コード

https://github.com/yurakawa/learn-system-programming-with-go/tree/master/ch10/s2-1

補足説明

Go の syscall をどう Rust 向けに変換していくかを現在議論中です。

@yuk1ty yuk1ty added the 実装追加 新しく実装を追加するラベルです label May 10, 2021
@yuk1ty yuk1ty added the 10章 ファイルシステムの最深部を扱う Go 言語の関数 label May 10, 2021
@laysakura
Copy link
Collaborator

Slackでの議論転載:

image

@laysakura
Copy link
Collaborator

『Goなら...』において「libcの関数を叩こう」という趣旨の箇所は(PDF検索が正しければ)なさそうでした。

となると「このリポジトリにおいて、システムコールのラッパーとしてlibcクレートを使うか」については否定派です。
libcの関数はシステムコールのラッパーとしては分厚すぎるため、学習に不向きと考えます。

システムコールのラッパーとして nix クレートを使うのはありだと思います。
生のシステムコールに近いシグネチャで、かつRustっぽい入出力を兼ね備えたものたちが定義されています(write の例)。
『Goなら...』でもシステムコールを "直接" 叩くことはなく、syscall.Flock() などの、標準ライブラリに付属している(nix で定義されているような)薄いラッパーを叩いています。

以上をもって、

Go の syscall をどう Rust 向けに変換していくか

に対しては「nix を使う」を私からはおすすめします。
自由にご意見ください。

@laysakura
Copy link
Collaborator

laysakura commented May 10, 2021

一方で自分は学習用途として、 (Linux ABI, x86-64 を前提として) アセンブリでシステムコールを呼び出すコード(ある意味でGoの syscall.Foo() を定義するようなもの)も書いてみたいです。

共通見解としては前のコメントのとおりとして、10.2の別解として nix も libc も使わないやつを提出しようと思います。

@dalance
Copy link

dalance commented May 10, 2021

Goのsyscallに対応するのはnixな気がするのでそこは異論はないのですが、
nixの実装はlibcクレートの薄いラッパーなので、libcが分厚すぎるならnixはもっと分厚いということになってしまうかと思います。
なので「libcでもnixでもいいけど、nixの方がRust的なsafeインターフェースを提供しているのでnixにする」という感じかな、と。
あとsyscallクレートやasm!で直接書くのは少なくとも原書の内容を超えているので、別解扱いでいいと思います。

@laysakura
Copy link
Collaborator

laysakura commented May 10, 2021

おっしゃるとおりですね。

libcの関数はシステムコールのラッパーとしては分厚すぎるため

ここで意図したのは「 fwrite(3) などのlibcの関数がシステムコールのラッパーとして分厚い」ということでしたが、
libcクレートはシステムコールの薄いラッパーも提供しています( write(2) ラッパーの例)。

libcクレート(のシステムコールのサブセット部分)よりもnixクレートを好むのは

「libcでもnixでもいいけど、nixの方がRust的なsafeインターフェースを提供しているのでnixにする」

という理由です。

@dalance
Copy link

dalance commented May 10, 2021

了解です。
「システムコールのラッパーでないlibcの関数を呼ぶ」という部分がないなら、
あまり気にしなくていいのかもしれません。
あとnixは時々未対応のやつがあるので、もしなかった場合はlibcになりますね。

@yuk1ty yuk1ty added the コメントを募集 ディスカッションが必要で、コメントを募集しています label May 10, 2021
@hide5stm
Copy link
Contributor

9.2.x で goの os.Chmod(), os.Chown() によるファイルのpermission変更の例が出てくるのですが、
nixにありそうなので利用しようと思います。
お勧めあれば教えてください

@laysakura
Copy link
Collaborator

chmod(2) の方は標準ライブラリの set_permissions が対応しているみたいですので、こちらを使えば良いと思います。

chown(2) は自分の検索した限り標準ライブラリにはないので、nixのchown を使えば良さそうです。

@yuk1ty
Copy link
Owner Author

yuk1ty commented May 10, 2021

基本線は nix を利用するで行きましょうか。

あとnixは時々未対応のやつがあるので、もしなかった場合はlibcになりますね。

そうですね。私も使っててないやつをいくつか見つけた記憶があります。ラップする関数を作ったら大丈夫だと思います。

@udzura
Copy link

udzura commented May 11, 2021

「 fwrite(3) などのlibcの関数がシステムコールのラッパーとして分厚い
「libcでもnixでもいいけど、nixの方がRust的なsafeインターフェースを提供しているのでnixにする」

(あまり貢献できていない者からの意見ですみませんが)大変納得感がありました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
10章 ファイルシステムの最深部を扱う Go 言語の関数 コメントを募集 ディスカッションが必要で、コメントを募集しています 実装追加 新しく実装を追加するラベルです
Projects
None yet
5 participants