Les fichiers vides sous linux.
Les fichiers vides sous linux ou l'histoire de la commande magique :>
Le sujet peut paraitre surprenant mais il est important. Comment créer un fichier vide sous linux et comment "vider" un fichier.
# Le fichier "fichier.txt" n'existe pas.
# On vérifie
ls -l fichier.txt
# Retourne :
# ls: cannot access fichier.txt: No such file or directory
# Pour créer un fichier on fait:
touch fichier.txt
# Normalement touch sert à mettre à jour la date de dernière modification du fichier
# En revanche si il n'existe pas (comme c'est le cas ici) il est cré "vide"
# On vérifie
ls -l fichier.txt
# Retourne :
# -rw-r----- 1 user users 0 Feb 17 11:49 fichier.txt
# le fichier a bien une taille de 0 octets.
# on le remplis avec :
date >> fichier.txt
date >> fichier.txt
# On vérifie
ls -l fichier.txt
# Retourne :
# -rw-r----- 1 user users 58 Feb 17 11:51 fichier.txt
# le fichier a bien grossi.
cat fichier.txt
# nous donne:
cat fichier.txt
# Mon Feb 17 11:50:59 CET 2025
# Mon Feb 17 11:51:01 CET 2025
Maintenant on suppose que ce fichier est ouvert par un process qui envoie des données dedans. Exemple en C (log.c):
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *f;
char ch;
f = fopen("fichier.txt", "a");
if(f==NULL){
printf("Erreur lors de l'ouverture d'un fichier");
exit(1);
}
while((ch=getchar())!=EOF){
fputc(ch, f);
fflush(f);
}
fclose(f);
return 0;
}
On le compile
cc -o addlog log.c
On lance ce petit programme et on tape deux lignes :
ligne 1
ligne 2
On laisse tourner notre programme et, sur une autre console on regarde ce qu'il y a dans le fichier.
Mon Feb 17 11:50:59 CET 2025
Mon Feb 17 11:51:01 CET 2025
ligne 1
ligne 2
La tout va bien. Maintenant on se dit que ce fichier est bien assez gros et qu'il vaudrait mieux recommencer à zéro.
Si on fait un bête rm fichier.txt
le fichier disparait bien du disque mais si on continue a laisser des tarces avec "addlog
" (sans le relancer) le fichier ne réapparait pat. Lis nouvelles lignes sont perdues.
On a beau ajouter :
ligne 3
ligne 4
Aucun nouveau fichier : fichier.txt
m'apparait dans le répertoire.
Si je le recrée avec touch fichier.txt
on a bien un fichier vide fichier.txt mais les lignes entrées dans addlogs ne s'ajoutent pas. Le problème viens du fait que f
, le "descripteur de fichier" f = fopen("fichier.txt", "a")
pointe vers un "inode" qui disparait.
Il faudrait vider le fichier sans changer son inode.
Une technique "brutale" est :
echo "" > fichier.txt
Mais il y a plus élégant :
:> fichier.txt
Le fichier est bien "vidé" mais l'inode reste le même et, si on ajoute des lignes, elles apparaissent.