droit de fichier

droit de fichier - C - Programmation

Marsh Posté le 08-09-2011 à 21:23:13    

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
Reply

Marsh Posté le 08-09-2011 à 21:23:13   

Reply

Marsh Posté le 08-09-2011 à 22:25:15    

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.

Reply

Marsh Posté le 09-09-2011 à 06:14:39    

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
Reply

Marsh Posté le 09-09-2011 à 10:26:42    

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];


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed