Ya! Caranya adalah dengan mengakses file yang terhapus melalui /proc/self/fd/n
. Ini adalah trik khusus linux, sejauh yang saya tahu.
Jalankan program ini:
#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;
}
Itu menulis beberapa teks ke file, menghapusnya, tetapi membiarkan deskriptor file tetap terbuka dan kemudian membukanya kembali melalui rute yang berbeda. File tidak benar-benar dihapus hingga proses terakhir yang menahan deskriptor file terakhir menutupnya, dan hingga saat itu, Anda dapat memperoleh konten file melalui /proc
.
Terima kasih kepada bos lama saya Anatoly karena mengajari saya trik ini ketika saya menghapus beberapa file penting yang untungnya masih ditambahkan oleh proses lain!
Tidak, panggilan fcntl tidak akan membiarkan Anda menyetel bit baca/tulis pada deskriptor file terbuka dan satu-satunya cara untuk mendapatkan deskriptor file baru dari yang sudah ada adalah dengan menggunakan fungsi duplikat. Panggilan ke dup/dup2/dup3 (dan fcntl
) tidak mengizinkan Anda mengubah mode akses file.
CATATAN:ini berlaku untuk Linux, tetapi tidak berlaku untuk Unix lain secara umum. Di HP-UX, misalnya, [lihat (1) dan (2)] Anda dapat mengubah bit baca/tulis dengan fcntl
menggunakan F_SETFL pada deskriptor file terbuka. Karena deskriptor file dibuat oleh dup
berbagi bendera status yang sama, namun, mengubah mode akses untuk satu tanda akan selalu mengubahnya untuk yang lain.