« Les fichiers vides sous linux. » : différence entre les versions
(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.