|
親プロセスでFILE* fpに対してファイルをオープンします。 その後、forkで子プロセスを生成し、子プロセスですぐにfclose(fp)を行います。(子プロセスではファイルを使用しない為。) 子プロセスでファイルをfcloseした後、親プロセスでは引き続きfpに対して読み込みや書き込みを行えるでしょうか。 ファイルディスクリプタは、子プロセスで閉じても親プロセスに影響無いようですが、ファイルポインタは共有されている(?)様なので影響がありそうな気がするのですが、いかがでしょうか。 ■知りたい事 1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。 (開いたものは必要であれば明示的に閉じるようにしたい。) 2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。 よろしくお願い致します。 |
|
>>3115 koko > 1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。 > 2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。 fork したときの出力用バッファにデータがたまっていれば、子の fclose でバッファがフラッシュされます。そこで親も fclose すれば 同じ内容のバッファがファイルに出力され、同じ内容のデータが 2回書かれることになります。 なお fclose(3) しなかったとしても、exit(3) すれば結局は fclose されます。 # _exit(2) ならされません。 よって、 1. fflush(fp) 2. fork 3. 子は fclose (*A)、親は引き続き fp を使う がよろしいかと。 *A は、してもしなくても変わりませんが、子で使わないという 意志を明確に示すために fclose(3) した方がよいと僕は思います。 |
|
>>3115 koko 早速回答頂き、ありがとうございます。 動作を確認しましたところ、fflushしないと二重でデータが書き込まれていました。 fflushして回避する事にします。 もうひとつ、教えて頂けますでしょうか。 FILE*ではなく、ファイルディスクリプタに対してopen、write、closeで同じ事をした場合、ファイルディスクリプタはバッファリングされないのでfflushのような事をしなくても二重書き込みにはならないでしょうか。 実は、FILE*とファイルディスクリプタの両方を使用して同じ事をしている為、ちょっと心配になりました。 実動作を見た限りでは、ファイルディスクリプタは二重で書き込まれていない様なので大丈夫だとは思いますが...。 よろしくお願い致します。 |
|
>>3316 tomotomo No.3317は>>3316の間違いです。 すいません。 |
|
>>3117 koko > ファイルディスクリプタはバッファリングされないのでfflushのような事を > しなくても二重書き込みにはならないでしょうか。 されません。低レベル入出力システムコールはバッファリングが ないので大丈夫です。 |
|
>>3119 68user 回答頂き、ありがとうございます。 安心しました。 |