Les fichiers vides sous linux.

De knowledge
Aller à la navigation Aller à la recherche


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.