そのようです:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
私は読んだのにman fcntl
、それが何をするのか理解できません。
回答:
これは、設定近いオンEXECの任意時に自動的に(及びアトミック)とファイル記述子を引き起こすファイル記述子、フラグが閉じexec
-family関数は成功します。
また、戻り値をテストして、操作が失敗したかどうかを確認します。これは、ファイル記述子が有効な場合、この操作が有効なファイル記述子で失敗する条件がないため、かなり役に立ちません。
open
といないaccept
、socket
、pipe
、等...
dup()
とdup2()
当然のことながら、影響を受けませんが)。おそらく、追加の「mode」または「flags」パラメーターを持つ新しい関数が必要になるでしょう。これがおそらくそれが起こらなかった理由です。ソケットでO_CLOEXECを使用できる場合は、accept()
返される記述子にそのフラグのクローンを作成すると想定できます。しかしsocket()
、そしてよりpipe()
トリッキーです。
dup
そしてdup2
影響を受けています。close-on-execフラグは、開いているファイル記述ではなくファイル記述子に適用されるため、複製されたファイル記述子間で共有されません。それはとても良いことです。
dup3
、pipe2
、とaccept4
。また、socket
持っているSOCK_CLOEXEC
あなたは要求されたソケットタイプを組み合わせることができフラグ。
これは、ファイル記述子にマークを付けてclose()
、プロセスまたはその子が関数ファミリーのfork()
1つを呼び出したときに自動的にdになるようexec*()
にします。これは、ファイル記述子がたとえばによって実行されるランダムなプログラムにリークしないようにするのに役立ちますsystem()
。
FILE *
ファイル記述子に関連付けられたファイルストリーム()のフラッシュについては何もしないことに注意してください。FD_CLOEXECの有効な使用法の1つは、シェルプロセスの実行時に親プロセスが開いているログファイルを閉じることです。POSIX 2008にはopen(2)
O_CLOEXECのオプションがあることに注意してください。ファイルを開くときにこのプロパティを設定できます。これは、広く利用可能になると非常に便利です。