GNU/Linux >> Tutoriels Linux >  >> Linux

emplacement du fichier temporaire lors de l'utilisation de tmpfile() en C

L'entrée de fichier dans le répertoire est probablement supprimée directement. Sur les systèmes POSIX, le fichier lui-même reste valide après la suppression, tant que vous avez un descripteur de fichier ouvert. (Dans votre cas caché dans le FILE* valeur de retour.)

Avec cette technique, personne ne peut se faufiler et ouvrir ce fichier, il n'est accessible que via votre variable tmp .


Compiler votre code et l'exécuter via strace révèle l'emplacement et le nom du fichier :

$ ./a.out
execve("./main", ["./main"], [/* 31 vars */]) = 0
brk(0)                                  = 0xe0c000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c51a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=103425, ...}) = 0
mmap(NULL, 103425, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f038c500000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\357\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1603600, ...}) = 0
mmap(NULL, 3717176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f038bf71000
mprotect(0x7f038c0f3000, 2097152, PROT_NONE) = 0
mmap(0x7f038c2f3000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x182000) = 0x7f038c2f3000
mmap(0x7f038c2f8000, 18488, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f038c2f8000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4ff000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4fe000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4fd000
arch_prctl(ARCH_SET_FS, 0x7f038c4fe700) = 0
mprotect(0x7f038c2f3000, 16384, PROT_READ) = 0
mprotect(0x7f038c51c000, 4096, PROT_READ) = 0
munmap(0x7f038c500000, 103425)          = 0
stat("/tmp", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
getpid()                                = 25957
open("/tmp/tmpfflAlKG", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
unlink("/tmp/tmpfflAlKG")               = 0
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
brk(0)                                  = 0xe0c000
brk(0xe2d000)                           = 0xe2d000
fstat(3, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c519000
lseek(3, 0, SEEK_CUR)                   = 0
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c518000
read(0, alk
"alk\n", 1024)                  = 4
exit_group(0)                           = ?

"/tmp/tmpfflAlKG" est créé via open()

open("/tmp/tmpfflAlKG", O_RDWR|O_CREAT|O_EXCL, 0600) = 3

puis obtient immédiatement unlink()

unlink("/tmp/tmpfflAlKG")               = 0

donc l'entrée de répertoire visible disparaît.

Comme toujours ouvert au processus, le fichier lui-même reste valide pour le processus jusqu'au processus close() asseoir. Ce dernier se produit implicitement via l'appel à exit_group() :

exit_group(0)                           = ?

Linux
  1. Comment activer l'hibernation sur Ubuntu (lors de l'utilisation d'un fichier d'échange)

  2. Utilisation de nc pour transférer un fichier volumineux

  3. Comment remplir un fichier avec FF en utilisant dd ?

  4. Convertir le fichier en PDF à l'aide de LibreOffice sous l'utilisateur apache (c'est-à-dire lors de l'utilisation de PHP)

  5. Utilisation de vim pour forcer la modification d'un fichier lorsque vous l'ouvrez sans autorisation

Utilisation du fichier de configuration SSH

Encodage d'un fichier Zip ?

Comment afficher l'emplacement du pointeur de la souris à l'aide d'un clic de souris ?

Comment :une introduction à l'utilisation de Git

Transférer des fichiers à l'aide de WinSCP

Copier un fichier uniquement lorsqu'il est plus récent que la destination