/dev/nullはどのように実装されますか?

/dev/nullはどのように実装されますか?

プロセスがこの特殊ファイルに書き込むときに何が起こるのかわかりません。すべてのバイトはどうなりますか? /dev/nullに書き込むのがCPUリソースを占有しないのはなぜですか? Linuxのソースコードを参考に答えていただければ幸いです。

Archフォーラムには次の答えがあります。

バッファは単に無視されます。

ただし、たとえばcat /dev/urandom> /dev/nullを実行すると、write_null関数を複数回または1回だけ呼び出す必要があり、バッファがどのように機能するかを理解できません。

ベストアンサー1

Linuxでは、/dev/null以下を含む多くの機能で実装されています。write_null:

static ssize_t write_null(struct file *file, const char __user *buf,
              size_t count, loff_t *ppos)
{
    return count;
}

ご覧のとおり、バッファは完全に無視され、関数が行うことは書き込み要求されたバイト数を返すだけです。

この関数は複数回呼び出すことができ、各呼び出しにはわずかなコスト(カーネル呼び出しコスト)が発生します。走れば

cat /dev/zero > /dev/null

この費用は支配的かもしれません。cat読み取るコンテンツが足りないか書き込めなくなるまで、入力(または指定されたファイル)から繰り返し読み込み、出力を書き込みます。/dev/urandomしかし、読むとき読むのはもっと複雑です、私はこれが支配的であると期待しています。どちらの場合も、すべての「I / O」はCPUベースであり、cat最終的にかなりの量のCPU(論理CPUの100%)を使用します。最終的にwrite_nullカーネル呼び出しはできるだけ早く行われますが、何もしません。できるだけ早く。

プログラムの情報出力を破棄するために使用されるなど、より一般的な場合は、書き込み回数がはるかに少なく、プログラムが/dev/null実行する他の操作と比較して全体のコストは無視できます。

/dev/zero(ところで、上にリンクされたコードのすぐ後ろの実装が示されています。)/dev/null

おすすめ記事