1

C で小さなプログラムを作成し、ファイルを正常に開き、20 秒間スリープを呼び出しました。その20秒で、シェルからrmを使用して開いているファイルを削除しました。スリープ後、プログラムはデータを正常に読み取り、画面に表示します。

int bytes_read;
FILE *fp = fopen("/tmp/file", "r");
sleep(20);
bytes_read = fread(buf, 1, 5, fp);
buf[bytes_read] = '\0';
printf("%s", buf);

0 バイトを読み取ると思っていましたが、実際のデータがファイルに出力されます。この動作の背後にある説明は何ですか。

4

1 に答える 1

11

Linux やその他の POSIX システムでは、ファイルを削除しません。ディレクトリから i ノードを削除するだけです。ファイルで開いているファイル記述子がある限り、そのファイルは削除されません。iノードへの最後のリンクと最後に開いたファイル記述子がなくなったときのみ。

于 2013-01-03T20:19:48.113 に答える