2

シェルからターゲット ファイルを削除した後でも、write() システム コールで何かを書き込むことができるのはなぜですか?

最初の数回の書き込みが成功した後にファイルを削除すると、 write() が失敗することを期待していましたが、そうではなく、どこに書き込むのかわかりません。

誰でもこれを説明できますか、ありがとう!!

私のテストサンプルコードは次のとおりです。

int fd = open ("./test.txt", O_CREAT | O_RDWR | O_APPEND, 0666);
if (fd == -1)
    error_and_exit ("open() failed");

ssize_t written = 0;
char buf[] = "apple\n";

while (true)
{
    printf ("perform write...\n");
    written = write (fd, buf, sizeof(buf));
    if (written <= 0)
        error_and_exit ("write failed");
    printf ("=> wrote %d bytes\n", written);
    printf ("sleep %d...\n\n", SLEEP_TIME);
    sleep (SLEEP_TIME);
}
4

3 に答える 3

10

ファイルの名前参照が残っていなくても (ファイル システムに inode がある場合は、inode レベルで) ファイルは物理的に削除されません (ファイル システムに inode がある場合)。別名削除)。これは、ファイルを作成してからその名前を削除することにより、POSIX (Unix) システム用の一時的で匿名のファイルを作成する方法です。

ログファイルを開いたままにするデーモンプロセスがある場合、デーモンは(新しいファイルではなく)古いファイルに書き込みを続ける可能性が高く、デーモンが終了するまで(または、より正確には、古いログ ファイルのファイル記述子を閉じます)。

于 2012-04-19T14:44:18.833 に答える
1

ファイルを rm した場合、その後のファイルの「検索」(読み取り用に開くなど) の試行は失敗します。既存のプロセスは、ファイルを終了するか閉じるまで、引き続きファイルにアクセスできます。ファイルに書き込まれた情報は、それまでプロセスからアクセスできます。その後、情報にアクセスできなくなります (「特別な」手段を除きます。詳細については、「linux unix で削除されたファイルを復元する」を検索してください)。

于 2012-04-19T14:48:52.610 に答える
1

Linux は、すべてのファイルのカウンターを保持します。ファイルを開くと、増加します。ファイルを削除すると、カウンターが 1 減ります。カウンターがゼロの場合、ファイルは実際には削除されたと見なされます。

したがって、プログラムがファイルを開くと、カウンターは 1 から 2 に増加し、ファイルを削除すると、カウンターは再び 1 に減少します。ファイルを閉じるまで再び減少することはありません。そうすると、カウンターはゼロになり、実際のファイルは削除されます。

于 2012-04-19T14:46:19.877 に答える