comment faire des trous dans le fichier pour effacer les données par c sous linux

Mise à jour: Cette FALLOC_FL_PUNCH_HOLE n’est pas supscope à l’origine par la version 3.0.0-17 , je pense que j’ai besoin de la corriger.

Je sais que Linux possède cette fonctionnalité de hole , et je me demande si je pourrais faire un trou dans un fichier existant.

Pour spécifique, j’ai créé un fichier nommé hole_test par ces codes:

  18 #include  19 #include  20 #include  21 #include  22 #include  23 #include  24 25 int main(int argc, char **argv) 26 { 27 int fd; 28 char a[7]="happy!"; 30 fd = open("hole_test", O_CREAT|O_RDWR, 0666); 31 if(fd == -1) 32 printf("error, %s\n", (char *)strerror(errno)); 35 // fallocate(fd, 0x02, 0,0); 36 // pwrite(fd, a, sizeof(a), 0); 37 // pwrite(fd, a, sizeof(b), 65536); 38 close(fd); 39 return 0; 40 } 

tout d’abord, j’utilise L36 L37 pour créer un fichier. la stat hole_test montre que:

  File: `hole_test' Size: 65540 Blocks: 16 IO Block: 4096 regular file Device: 801h/2049d Inode: 1052101 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ bxshi) Gid: ( 1000/ bxshi) Access: 2012-04-03 23:02:35.227664608 +0800 Modify: 2012-04-03 23:02:35.227664608 +0800 Change: 2012-04-03 23:02:35.227664608 +0800 

Ensuite, j’utilise L35 et le commentaire L36 L37 pour faire un trou dans mon fichier. (0x02 est égal à FALLOC_FL_PUNCH_HOLE , je n’ai pas trouvé où il est défini, il suffit d’utiliser sa valeur)

et ensuite, avec stat hole_test , les Blocks sont toujours 16.

  File: `hole_test' Size: 65540 Blocks: 16 IO Block: 4096 regular file Device: 801h/2049d Inode: 1052101 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ bxshi) Gid: ( 1000/ bxshi) Access: 2012-04-03 23:02:35.227664608 +0800 Modify: 2012-04-03 23:02:35.227664608 +0800 Change: 2012-04-03 23:02:35.227664608 +0800 

Je veux savoir si je pourrais faire de nouveaux trous dans ce fichier hole_test pour effacer les données existantes?

Comment pourrais-je faire un trou dans hole_test avec un décalage de 0 à 7, de cette façon, je pense que les Blocks pourraient devenir 8 et que la chaîne que j’ai écrite disparaîtrait.

J’espère que vous savez ce que j’ai dit et que vous me donnez des conseils.

Vous utilisez fallocate(fd, FALLOC_FL_PUNCH_HOLE, offset, len) . (Pris en charge depuis Linux 2.6.38) Voir https://lwn.net/Articles/415889/ pour plus de détails sur les coulisses et les correctifs correspondants.

Selon la page de manuel de fallocate (2) :

L’indicateur FALLOC_FL_PUNCH_HOLE doit être OUI avec FALLOC_FL_KEEP_SIZE en mode; En d’autres termes, même lorsque la fin du fichier est poinçonnée, la taille du fichier (telle que rapscope par stat (2)) ne change pas.

Au moins sur ext4 , si vous passez juste FALLOC_FL_PUNCH_HOLE , fallocate() renverra une Operation not supported .

Notez également que:

Les drapeaux FALLOC_FL_ * sont définis dans les en-têtes de glibc uniquement depuis la version 2.18.

Vous devrez donc peut-être les définir manuellement si vous utilisez un kernel pris en charge avec une version antérieure de libc:

 // Constants are defined in glibc >= 2.18 #define FALLOC_FL_KEEP_SIZE 0x1 #define FALLOC_FL_PUNCH_HOLE 0x2