はい!トリックは /proc/self/fd/n
経由で削除されたファイルにアクセスすることです .私の知る限り、これは Linux だけのトリックです。
このプログラムを実行します:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE* out_file;
FILE* in_file;
char* dev_fd_path;
char buffer[128];
/* Write “hi!” to test.txt */
out_file = fopen("test.txt", "w");
fputs("hi!\n", out_file);
fflush(out_file);
/* Delete the file */
unlink("test.txt");
/* Verify that the file is gone */
system("ls test.txt");
/* Reopen the filehandle in read-mode from /proc */
asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file));
in_file = fopen(dev_fd_path, "r");
if (!in_file) {
perror("in_file is NULL");
exit(1);
}
printf("%s", fgets(buffer, sizeof(buffer), in_file));
return 0;
}
テキストをファイルに書き込み、削除しますが、ファイル記述子を開いたままにし、別のルートで再度開きます。最後のファイル記述子を保持している最後のプロセスがファイルを閉じるまで、ファイルは実際には削除されません。それまでは、/proc
を介してファイルの内容を取得できます。 .
幸いなことに、別のプロセスによってまだ追加されているいくつかの重要なファイルを削除したときに、このトリックを教えてくれた古い上司のアナトリーに感謝します!
いいえ、fcntl 呼び出しでは、開いているファイル記述子に読み取り/書き込みビットを設定できません。既存のファイル記述子から新しいファイル記述子を取得する唯一の方法は、複製機能を使用することです。 dup/dup2/dup3 (および fcntl
の呼び出し) ) ファイル アクセス モードを変更することはできません。
注:これは Linux には当てはまりますが、他の Unix 全般には当てはまりません。たとえば、HP-UX では [(1) と (2) を参照] fcntl
で読み取り/書き込みビットを変更できます。 開いているファイル記述子で F_SETFL を使用します。 dup
によって作成されたファイル記述子以降 同じステータス フラグを共有しますが、一方のアクセス モードを変更すると、必然的に他方のアクセス モードも変更されます。