2017-05-08 3 views
2

私はLinuxが今やrenameat,fstatatopenatなどの他の呼び出しを持っていることに気がつきました。ファイルディスクリプタに対する相対パスは、プロセスの現在の作業ディレクトリを基準にして相対的に解釈するのではなく、場合。Linuxはコール時に*をたくさん取得したようですね?これらの動機は何ですか?

なぜこれらの呼び出しが追加されましたか?ほとんどのシステムコールには、パス名の引数を持つバージョンのatがあるようです。そのためには、かなり魅力的なユースケースが必要です。しかし、私はそれが何であるか考えることはできません。

+0

私たちが記憶を持っているのと同じくらい長い経路をサポートするというアイデアは、それを恣意的なものに関連付けることは悪い考えです。 – 0andriy

+0

私は、現在のディレクトリ以外の何かに相対的なパスを参照すると便利だと思います。また、カーネルを助けることもできます。長いパスを何度も渡す代わりに、プロセスが相対的に短いパスを渡すことができます。カーネルには、パラメータとして渡されたfdのキャッシュされたデータがあります。 – linuxfan

+0

私は、両方の理由よりも説得力があると思う。私は、名前が変更されても特定のディレクトリで予測可能に動作できるプロセスに関係している可能性があると考えています。 – Omnifarious

答えて

2

これらのすべての*atルーチンは、POSIXの一部として導入されました。

openatの目的()関数の条件をレースに触れることなく、現在の作業ディレクトリ以外のディレクトリにあるファイルを開くを有効にすることです:あなたはopenat routineの根拠セクションに掘る場合は、次の段落見つかります。ファイルのパスのどの部分も、open()の呼び出しと並行して変更することができ、結果として不特定の振る舞いになります。ターゲットディレクトリのファイル記述子を開き、openat()関数を使用することで、開いているファイルが目的のディレクトリからの相対位置にあることが保証されます。

つまり、セキュリティ対策です。

関連する問題