« Les fichiers vides sous linux. » : différence entre les versions

De knowledge
Aller à la navigation Aller à la recherche
(Page créée avec « Le sujet peut paraitre surprenant mais il est important. Comment créer un fichier vide sous linux et comment "vider" un fichier.<syntaxhighlight lang="bash"> # 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... »)
 
mAucun résumé des modifications
Ligne 52 : Ligne 52 :
     while((ch=getchar())!=EOF){
     while((ch=getchar())!=EOF){
         fputc(ch, f);
         fputc(ch, f);
        fflush(f);
     }
     }


Ligne 67 : Ligne 68 :
Mon Feb 17 11:50:59 CET 2025
Mon Feb 17 11:50:59 CET 2025
Mon Feb 17 11:51:01 CET 2025
Mon Feb 17 11:51:01 CET 2025
ligne 1
ligne 1
ligne 2
ligne 2


</syntaxhighlight>
</syntaxhighlight>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 <code>rm fichier.txt</code> le fichier disparait bien du disque mais si on continue a laisser des tarces avec "<code>addlog</code>" (sans le relancer) le fichier ne réapparait pat. Lis nouvelles lignes sont perdues.
 
On a beau ajouter :<syntaxhighlight lang="text">
ligne 3
ligne 4
 
</syntaxhighlight>Aucun nouveau fichier : <code>fichier.txt</code> m'apparait dans le répertoire.
 
Si je le recrée avec <code>touch fichier.txt</code> 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 <code>f</code>, le "descripteur de fichier" <code>f = fopen("fichier.txt", "a")</code> pointe vers un "inode" qui disparait.
 
Il faudrait vider le fichier sans changer son inode.
 
Une technique "brutale" est :<syntaxhighlight lang="bash">
echo "" > fichier.txt
</syntaxhighlight>Mais il y a plus élégant :<syntaxhighlight lang="bash">
:> fichier.txt
</syntaxhighlight>Le fichier est bien "vidé" mais l'inode reste le même et, si on ajoute des lignes, elles apparaissent.

Version du 17 février 2025 à 13:47

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.