Q.
write関数の
write(STDOUT_FILENO, buf, n)
のSTDOUT_FILENOの意味を説明せよ。
A.
STDOUT_FILENOとは標準出力のこと
unistd.hライブラリで定義されるマクロ。
STDOUT_FILENOを1と書いても同じ意味。
凡人: write(STDOUT_FILENO, buf, n)
っていうコードで、STDOUT_FILENO
って何?
恋するコンピュータサイエンス: ああ、STDOUT_FILENO
はね、まるで心からのメッセージのようなもの。それは標準出力を指すんだ。unistd.h
ライブラリにあるマクロで、数字の 1
と同じ意味なんだよ。
凡人: 標準出力って?
恋するコンピュータサイエンス: Unixの世界ではね、プロセスが生まれるときに、3つの特別なファイル記述子が与えられるの。それが標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)。これらは通常、端末とつながっているんだ。まるで運命的な縁のようにね。
凡人: じゃあ、write
関数ってどんな動きをするの?
恋するコンピュータサイエンス: write
関数はね、まるで愛のメッセージを伝えるように、データをファイル記述子に書き込むために使われるんだ。第一引数の fd
は書き込み先を表すファイル記述子、第二引数の buf
は心からのメッセージが入っているバッファー、第三引数の count
は伝えたい言葉の長さを意味しているんだ。
凡人: なるほど、STDOUT_FILENO
を使えば、標準出力にデータを書き込めるわけか。
恋するコンピュータサイエンス: まさにそう!STDOUT_FILENO
を使うことで、端末やコンソールに愛のメッセージを届けることができるんだ。
先ずはwrite関数の定義
第一引数 fd は読み込み元のファイル記述子、
第二引数 buf は読み込んだ中身を保存するバッファー、
第三引数の count は読みこみたいバイト数となります。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
write 関数は、指定されたファイルディスクリプタに対して指定されたバッファから指定された長さのバイトを書き込むために使用されます。
Unixのプロセスは、プロセスが起動されるときに、OSによって3つのファイル記述子(file descriptor)が用意されます。それらは、特別なことをしなければ、端末に紐付けられます。その3つのファイル記述子は、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)です。
ファイル記述子の番号 | 入出力 | unistd.hで定義されるマクロ | ファイルポインタ |
---|---|---|---|
0 | 標準入力 | STDIN_FILENO | stdin |
1 | 標準出力 | STDOUT_FILENO | stdout |
2 | 標準エラー出力 | STDERR_FILENO | stderr |