FD_CLOEXEC fcntl()フラグは何をしますか?


82

そのようです:

if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...

私は読んだのにman fcntl、それが何をするのか理解できません。

回答:


74

これは、設定近いオンEXECの任意時に自動的に(及びアトミック)とファイル記述子を引き起こすファイル記述子、フラグが閉じexec-family関数は成功します。

また、戻り値をテストして、操作が失敗したかどうかを確認します。これは、ファイル記述子が有効な場合、この操作が有効なファイル記述子で失敗する条件がないため、かなり役に立ちません。


4
FILE *ファイル記述子に関連付けられたファイルストリーム()のフラッシュについては何もしないことに注意してください。FD_CLOEXECの有効な使用法の1つは、シェルプロセスの実行時に親プロセスが開いているログファイルを閉じることです。POSIX 2008にはopen(2)O_CLOEXECのオプションがあることに注意してください。ファイルを開くときにこのプロパティを設定できます。これは、広く利用可能になると非常に便利です。
ジョナサンレフラー

ファイルが開かれるときにフラグをアトミックに設定することは、別のスレッドが外部プログラムを実行しているときにファイルを開く可能性のあるスレッドプログラムにとって非常に重要です。残念ながら、それはのためにのみ利用可能だopenといないacceptsocketpipe、等...
R .. GitHubのSTOP手助けICE

うん- (かかわらず、関数を作成する他のファイル記述子にO_CLOEXECまたは同等を追加する設計上の問題があるdup()dup2()当然のことながら、影響を受けませんが)。おそらく、追加の「mode」または「flags」パラメーターを持つ新しい関数が必要になるでしょう。これがおそらくそれが起こらなかった理由です。ソケットでO_CLOEXECを使用できる場合は、accept()返される記述子にそのフラグのクローンを作成すると想定できます。しかしsocket()、そしてよりpipe()トリッキーです。
ジョナサンレフラー

3
dupそしてdup2影響を受けています。close-on-execフラグは、開いているファイル記述ではなくファイル記述子に適用されるため、複製されたファイル記述子間で共有されません。それはとても良いことです。
R .. GitHub STOP HELPING ICE

3
:コメント欄での会話のフォローアップ、POSIXは、欠陥を修正し、次の問題新しいインターフェイスに含めるために採用しておりdup3pipe2、とaccept4。また、socket持っているSOCK_CLOEXECあなたは要求されたソケットタイプを組み合わせることができフラグ。
R .. GitHub STOP HELPING ICE 2014年

33

これは、ファイル記述子にマークを付けてclose()、プロセスまたはその子が関数ファミリーのfork()1つを呼び出したときに自動的にdになるようexec*()にします。これは、ファイル記述子がたとえばによって実行されるランダムなプログラムにリークしないようにするのに役立ちますsystem()


これはセキュリティ上の懸念事項ですか?
zach 2017

1
@zachあなたはそう言うことができます; しかし、実際には、分散ロジックを単一のエンティティにカプセル化するなど、実際に行うリファクタリングは、そのエンティティの誤った使用によるバグの可能性を減らすため、「セキュリティ上の懸念」と呼ばれることがあります。「バグ」は抽象的なものです。これには、特にセグメンテーション違反や情報漏えいが含まれます。
ハイエンジェル

だから私はいくつかのソケットコードをリファクタリングしていて、ソケットを取得してからリモートサーバーに接続するまでの間に、F_SETFDを使用してFD_CLOEXECフラグをソケットのFDに追加します。次に、接続が成功すると、FD_CLOEXECが削除されます。このコード領域に関係するexec()呼び出しが見つかりません。これらは、削除されるべきであったが削除されなかった古いコードの残骸であるかどうか疑問に思います。そのすべての目的を見つけるために何を探すべきかわからない。
JoeManiaci
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.