2017-11-23 13 views
0

このコードは書籍serious-cryptography-practical-modern-encryptionにあります。このネストされたfcntlは何をしますか?

入れ子のfcntlは何をしていますか? ファイルディスクリプタを取得し、FD_CLOEXECでそれをOred、私はここで何が起こっているかわかりません。

#ifndef O_CLOEXEC 
    fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); 

他のコードはわかりやすくするために省略されています。

+0

'fcntl(fd、F_GETFD)'がエラーを返すかもしれないので、コードが安全ではないと思っていましたが、他の 'fcntl'もその状況で失敗すると予想していました。 – ikegami

+0

そう、私もそう思った。内側のfcntlから戻り値を取得し、エラーをチェックしてから2番目のメソッドに渡すのが最善の方法です。 –

+0

@ikegami彼は安全なコードについて説教しており、これは驚きです。指摘してくれてありがとう。 –

答えて

5

ファイルディスクリプタに

を取得いいえ、それは、フラグファイルディスクリプタのを取得します。 fcntl() manual pageを参照してください。外側の呼び出しでは、これらのフラグが設定され、さらにFD_CLOEXECが設定されます。これにより、exec()ファミリの関数が呼び出されたとき(つまり、プロセスが新しいプログラムイメージで置き換えられたとき)にファイルが閉じられることが保証されます。これは安全対策であり、開かれたファイルが偶発的に制御を渡すプログラムにexec*()でリークするのを防ぎます。

O_CLOEXECが利用できない場合にのみ実行されます。これにより、ファイルを開くときにすでにこのフラグを設定できます。

+0

ああ、内側の 'fcntl'は' fd'の 'O_RDONLY'などのようなフラグを返します。今は理にかなっている。しかし、 'fcntl'へのネストされた呼び出しをせずに直接fdに対して' FD_CLOEXEC'を設定するとどうなりますか?何か違いはありますか? –

+0

私はあなたのコメントを理解していません。あなたが**なし**を意味するならば、あなたは他のすべてのフラグをクリアするでしょう - >あなたが望むものではありません。 –

+0

それは間違いのため、申し訳ありません。助けてくれてありがとう。今はっきりしていますか?私はfcntlが古いフラグを上書きすることは知らなかった。 –

1

fcntl(fd, F_GETFD)は "getファイル記述子フラグ"であり、fcntl(fd, F_SETFD, flags)は "ファイル記述子フラグ設定"です。

したがって、全体的な意味は、「FD_CLOEXECをフラグのセットに追加」です。

関連する問題