Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
890 connectés 

  FORUM HardWare.fr
  Programmation
  C

  droit de fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

droit de fichier

n°2100467
mdj
Posté le 08-09-2011 à 21:23:13  profilanswer
 

bonsoir a tous , voila j'ai un exercice que j'ai essayé de faire ,
je vous propose l'exercice  ainsi que mes réponses ,  si mes réponses(très probable) sont fausses , je vous serais très reconnaissant de me corriger car j'ai l'impression d'etre passé a coté du but de l'exercice  
 
 

Code :
  1. $ ls -ail h
  2. 3427142 prw-r--r--  1 yunes  staff    0 16 Jan 13:05 h
  3. $


Code :
  1. // programme a.c
  2. #define L 1000
  3. int d; char buf[L]; int lu; int total;
  4. d = open(argv[1],O_RDONLY);
  5. printf("%s: %s ouvert\n",argv[0],argv[1]);
  6. while ((lu=read(d,buf,L))>0) {
  7.         buf[lu] = 0;
  8.         printf("J'ai lu %s\n",buf);
  9. }
  10. return EXIT_SUCCESS;


 

Code :
  1. // programme b.c
  2. #define L 10
  3. int d; char buf[L]; int lu; int total;
  4. d = open(argv[1],O_WRONLY);
  5. printf("%s: %s ouvert\n",argv[0],argv[1]);
  6. while ((lu=read(STDIN_FILENO,buf,L))>0)
  7.         write(d,buf,lu);
  8. close(d);
  9. return EXIT_SUCCESS;


 
   1 que se passe t-il si l'on exécute la commande a h depuis un terminal ?
   2 que se passe t-il si l'on exécute la commande b h depuis un autre terminal mais sur la même machine ?
   3 que se passe t-il lorsque on tape abcdef suivi d'un retour à la ligne sur le terminal depuis lequel on a lancé b ?
   4 que se passe t-il si l'on tape <CTRL>-D sur le terminal depuis lequel on a lancé b ?
 
reponses :
 
 
  1 le programme a n'entrera pas dans le while et n'ecrira rien, car le fichier est de taille nulle , vide  
 
  2 l'ouverture du fichier avec retournera une erreur   car le fichier est deja ouvert en lecture  
 
  3 ca devrais ecrire dans le fichier mais comme il ne s'est pas ouvert bah je me plante peut etre  
 
  4 on quite le programme b  
 
EDIT: je viens d'essayer les programmes et le fichier s'ouvre bien a la question 2 et on ecrit bien dedans !
 
toute suggestion est la bienvenue  
merci pour votre aide


Message édité par mdj le 08-09-2011 à 21:44:20
mood
Publicité
Posté le 08-09-2011 à 21:23:13  profilanswer
 

n°2100490
xilebo
noone
Posté le 08-09-2011 à 22:25:15  profilanswer
 

Salut,
 
les 2 codes que tu donnes en exemple sont incomplets :
 
il manque au moins le main + les includes nécessaires pour faire une application qu'on peut tester.
Le code de a.c ne ferme pas le descripteur de fichier avant de quitter l'application.
la valeur de retour d'open n'est pas testée.
 
 
 
Pour tes réponses :
 
1. ton fichier est un fichier spécial de type pipe (p) . C'est normal que sa taille vaut 0. Par contre, par défaut, le read est bloquant et va donc bloquer jusqu'à ce qu'un caractère soit reçu dans le pipe. L'application ne quitte donc pas.
 
2. Non, ce n'est pas parce qu'un fichier est ouvert en lecture qu'on ne peut pas l'ouvrir en écriture. Tu peux avoir sans problème plusieurs lecteurs et un écrivain sur un fichier. Tu peux même avoir plusieurs écrivains dans certains cas. Voir différents cas en consultant l'aide de la fonction open ( http://pubs.opengroup.org/onlinepu [...] /open.html ou man open dans google ). Dans le cas présent, le pipe est ouvert en écriture, et le read suivant bloque sur l'entrée standard.
 
3. le read retourne après le retour chariot , et buf contient ta chaine ainsi que ton retour chariot.  Ensuite ton programme écrit le contenu du buffer dans ton pipe, puis boucle pour rebloquer sur l'entrée standard. de l'autre coté , a étant toujours lancé, le read bloquant sur le pipe débloque, et t'affiche à l'écran ta chaine de caractère + le retour chariot.  
 
Je ne suis par contre pas assez calé en système pour t'expliquer pourquoi le read de b débloque seulement après le retour chariot et non à chaque caractère. Je ne sais pas t'expliquer non plus pourquoi si tu tapes plus de 10 caractères, la partie tronquée ne sera pas lu au read suivant ( certainement parce que le read n'est pas bufferisé et donc tout ce qui n'est pas "lu" est perdu ).
 
4. On quitte b ET a. Maintenant, à toi de savoir pourquoi ;) Pour info, CTRL-D écrit sur l'entrée standard le caractère EOF.
 
En espérant t'aider un peu.

n°2100507
mdj
Posté le 09-09-2011 à 06:14:39  profilanswer
 

on fait j'ai testé sur un fichier normal, je n'avais par remarqué que c’était un pipe !
 
pour la dernière question, read renvoi 0 a la fin du fichier , donc a la lecture de EOF il me semble . Donc il retourne 0 a la lecture de EOF sur l'entrée
Comme tu me dis que a et b quittent , cela signifie que b ecrit EOF dans le pipe , qui est ensuite lu par le read  du programme a  et quitte le while a son tour et donc return
 
Mais il ya un point que je ne comprends pas ! c'est lorsque le read du  programme b lit EOF,  read est censé retourner 0; donc il ne rentre pas dans le while et write  n'ecrit pas EOF dans le pipe !    
 
en tout cas je te remercie pour  tes explications sont  très clairs et précises


Message édité par mdj le 09-09-2011 à 06:17:53
n°2100540
olivthill
Posté le 09-09-2011 à 10:26:42  profilanswer
 

Pour infos, il y a une fuite mémoire potentielle à cause de la ligne

       buf[lu] = 0;

Si lu est 1000, alors on a buf[1000] = 0, or ce tableau ne contient que 1000 éléments dont le premier est à l'indice 0 (et non pas 1, par convention du langage C).
Donc, il faudrait définir buf avec un octect de plus :

char buf[L + 1];



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  droit de fichier

 

Sujets relatifs
Mise en page d'après une fichier de donnéesDéveloppement outil permissions NTFS fichiers
droit à un fichierListage des utilisateurs ayant droit de lire un fichier/répertoire
[résolu]pb de droit sur fichier upload via script [merci!][VBS] Obtenir le nom long du fichier par clic droit
Envoie de fichier et droit d'accés[PHP] Pb avec droit apres upload d'un fichier [RESOLU]
[c++] droit des fichierinterdire le clic droit de la souris sur un fichier flash: javascript
Plus de sujets relatifs à : droit de fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR