Goで学ぶファイルディスクリプタ

Go言語

今回はファイルディスクリプタの解説をしていきます。こちらを読むことで、プログラムからファイルを操作がどのようにされているか理解することができます。

ファイルディスクリプタとは?

ファイルディスクリプタとはプログラムからファイルを操作する際に、操作するファイルを識別するために割り振られる番号である。OSにファイルの操作を依頼する時にこの識別番号を使用する。
ファイルディスクリプタは、通常のファイル以外にも標準入力、ソケットなど、本来ファイルシステムでないものにもファイルディスクリプタは割り当てられて、どれもファイルと同じようにアクセスできる。

ファイルディスクリプタの例

OSはプロセス起動時に3つの擬似ファイルを作成してそれぞれにファイルディスクリプタを割り当てる。0が標準入力で、1が標準出力、2が標準エラーです。それぞれのファイルディスクリプタを使って操作することで標準入手出力や標準エラーが可能になる。
Goの標準パッケージであるosのfile.goを見ると、NewFileで標準入手出力や標準エラーを定義している。

https://cs.opensource.google/go/go/+/refs/tags/go1.23.0:src/os/file.go;l=70
Search and explore code

var (
	Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
	Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
	Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

syscallパッケージを確認するとStdin、Stdout、Stderrは0,1,2であることがわかる。
https://cs.opensource.google/go/go/+/refs/tags/go1.23.0:src/syscall/syscall_unix.go;l=22

var (
	Stdin  = 0
	Stdout = 1
	Stderr = 2
)

Goで出力する時に使用するfmt.Println関数の中身を確認すると、Stdoutに書き込んでいることが分かる。

https://cs.opensource.google/go/go/+/refs/tags/go1.23.0:src/fmt/print.go;l=314
Search and explore code

func Println(a ...any) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

理解度チェック

今回の内容がわかっているかの問題を作成しています。
問題をクリックすると、答えが表示されますので、今回の内容を理解できたかチェックをしてみてください。

Q.ファイルディスクリプタとは?
A.ファイルディスクリプタとはプログラムからファイルを操作する際に、操作するファイルを識別するために割り振られる番号である。OSにファイルの操作を依頼する時にこの識別番号を使用する。

Q.ファイルディスクリプタは使用できるのはファイルだけか?
A. ファイル以外にも使用できる。標準入力、ソケットなど、本来ファイルシステムでないものにもファイルディスクリプタは割り当てられて、どれもファイルと同じようにアクセスできる。

まとめ

今回はファイルディスクリプションについて説明をしてきました。この記事を読んでプログラムのファイル操作について理解深めてもらえたらと思います。
GoについてなぜGoが並行処理に優れているのか、Goでのメモリ管理をするアロケータやガーベージコレクションについて書いた記事がありますので、興味があればそちらも読んでみてください。

【おすすめ記事のリンク】

参考

コメント

タイトルとURLをコピーしました