0

UNIX 環境で実行される C で開発されたサーバー コードを用意すると、サーバーは次のように STDOUT/STDERR をログにリダイレクトします。

static gboolean
create_log_file (const char *log_file)
{
  int log_file_fd;

  g_return_val_if_fail (log_file != NULL, FALSE);

  log_file_fd = open (log_file, O_WRONLY|O_CREAT|O_TRUNC, 0644);

  if (log_file_fd < 0)
    {
      return FALSE;
    }

  dup2 (log_file_fd, 1);
  dup2 (log_file_fd, 2);

  close (log_file_fd);

  return TRUE;
}

ディスク使用量が制限内であることを確認するために、このログ ファイルのアーカイブ/パージ cron を設定する予定です。

パージ cron が開始され、ログファイルが削除されるまで、ロギングは完全に正常に機能します。

cron 実行によるログ ファイルの削除後、STDERR トレースが停止し、ファイルが作成されないことを確認します。

4

1 に答える 1

1

open(2)開かれると、ファイル記述子は、関数呼び出しの時点で渡された名前によって指定されたファイルとの関連付けを保持します。後でディスクからファイルを削除すると、その名前からリンクが解除されますが、ファイルへのすべての参照がなくなるまで、ファイルは存続します。

ファイルを削除すると、プログラムは参照の唯一の保持者になります。プログラムは引き続きファイルに書き込みますが、そのファイルに名前を付けることはできなくなります。カーネルが実際にそのような不良ファイルの名前を再取得できないようにするセキュリティ上の理由があり、OS を変更しないとファイルを元に戻すことはできません (そのようなゾンビの復活を可能にする Linux カーネル モジュールがありますが、はWindowsに匹敵するものがあるとは思えません)。プログラムが終了すると、ファイルは完全に削除されます。

于 2012-08-27T16:12:30.877 に答える