processus pere et fils qui affiche un morceau de mot chacun leur tour?

processus pere et fils qui affiche un morceau de mot chacun leur tour? - C - Programmation

Marsh Posté le 23-11-2004 à 16:47:44    

J'ai un pb que je ne sais pas bien gérer, et déterminer ce qu'il faut que j'utilise.
 
En fait j'ai un fichier qui contient le message suivant "123456789COUCOULESPETITSAMIS". J'ai alors écris deux processus qui affichent alternativement un message lu à partir de ce fichier.
Je vous file une trace de l'exécution :
Hello père; mon message est : 1234
Hello fils; mon message est : 5678
Hello père; mon message est : 9COU
Hello fils; mon message est : COUL
Hello père; mon message est : ESPE
Hello fils; mon message est : TITS
Hello père; mon message est : AMIS
 
Voici déjà un bout de mon code:

Code :
  1. #include <stdio.h>
  2. int main(){
  3. char buffer[29],tampon[4],tampon2[4];
  4. int fils,i,k,l,m,n,p,q;
  5. file = fopen("fichier.txt","r" );
  6. fgets(buffer,sizeof(buffer),file);
  7. printf("le message est : %s et la taille de la chaine est de %d caracteres\n",buffer,strlen(buffer));
  8. fclose(file);
  9. k = 0;
  10. l = k + 4;
  11. p = 4;
  12. q = p + 4;
  13. if((fils=fork()==0){
  14.  m = 0;
  15.  for(i = k; i < l; i++){
  16.   tampon[m] = buffer[i];
  17.   m++;
  18.  }
  19.  k = l + 4;
  20.  l = k + 4;
  21.  tampon[m]='\0';
  22.  printf("Hello pere; mon message est : %s",tampon);
  23. }
  24. else
  25. {
  26.  n = 0;
  27.  for(i = p; i < q; i++){
  28.   tampon2[n] = buffer[i];
  29.   n++;
  30.  }
  31.  p = q + 4;
  32.  q = p + 4;
  33.  tampon[n]='\0';
  34.  printf("Hello fils; mon message est : %s",tampon2);
  35. }
  36.         printf("l vaut %d et q vaut %d\n",l,q);
  37. }


 
Ce programme m'affiche pour l'instant :
Hello père; mon message est : 1234
l vaut 12 et q vaut 8
Hello fils; mon message est : 5678
l vaut 4 et q vaut 16
 
1ère question :
Faut-il utiliser des pipes pour synchroniser le pere et le fils pour qu'entre chaque calcul, l'un affiche sa partie, puis que l'autre processus affiche la sienne et ainsi de suite?  
 
2ème question :
Pourquoi la phrase "l vaut x et q vaut y" s'affiche 2 fois alors qu'elle est située après le if?
 
PS: dsl d'être si nul :D


Message édité par angelseb le 23-11-2004 à 19:36:06
Reply

Marsh Posté le 23-11-2004 à 16:47:44   

Reply

Marsh Posté le 25-11-2004 à 22:52:45    

Reply

Marsh Posté le 26-11-2004 à 11:16:49    

C'est Super comme question !!  :bounce:  
 
En tout cas, www.uvhc.fr je suis d'accord  :pt1cable:
et peut-être même que l'on peut rajouter "ISTV"... :p


Message édité par niouts le 26-11-2004 à 11:18:44
Reply

Marsh Posté le 26-11-2004 à 15:09:09    

y'en a du monde ici qui est en iup2 gmi :D

Reply

Marsh Posté le 26-11-2004 à 15:12:51    

oui

Reply

Marsh Posté le 26-11-2004 à 17:39:44    


de l' ISTV ca seré marrant  :p  
 
sinon moi j'ai pas cherché compliqué j'ai fait ca avec un sleep
 
j'ouvre le fichier en lecture
je fais un fork
le fils attend 1 sec comme ca le pere commence
ensuite pr le pere et le fils
tant que l'on peut lire ds le fichier on affiche les caracteres lu (au max 4) et on fait un sleep (1 seconde est largement suffisante ;) )
et ne pas oublier de fermer le fichier mm s'il se ferme 2 fois une par le pere et une par le fils mais bon ...
 
@+


Message édité par elbelereux le 26-11-2004 à 17:40:48
Reply

Marsh Posté le 26-11-2004 à 18:56:19    

Angelseb a écrit :


1ère question :
Faut-il utiliser des pipes pour synchroniser le pere et le fils pour qu'entre chaque calcul, l'un affiche sa partie, puis que l'autre processus affiche la sienne et ainsi de suite?


Absolument pas. Le pipe sert à transmettre des informations entre 2 processus, pas à les synchroniser. Evidemment, la synchro est induite puisque le processus qui lit reste bloqué jusqu'à ce que le processus qui écrit écrive dans le pipe mais la synchro n'est pas le but du pipe.
 
Si tu veux faire juste une simple alternance p1/p2, tu peux mettre des "sleep" comme cela a été dit ou, si tu veux vraiment être pro, tu inclus dans ton code des sémaphores avec l'algo suivant
- création/initialisation du sémaphore avant le fork - Initialisation à "1" ("man semget" et "man semctl" )
- Après le fork, tu programmes dans le père et le fils les algo suivant identiques pour les 2 processus
=> prendre le sémaphore (opération -1)
=> travailler
=> rendre le sémaphore (opération +1)
Comme la prise ne se fera que sur l'un des processus, l'autre restera bloqué (un sémaphore ne peut pas être négatif) jusqu'à ce que le processus qui a la main rende le sémaphore.
 

Angelseb a écrit :


2ème question :
Pourquoi la phrase "l vaut x et q vaut y" s'affiche 2 fois alors qu'elle est située après le if?


Parce que, dès que le "fork" est lancé, tout le reste du code se duplique. Tout le "if/else" est dupliqué dans les 2 processus mais chacun d'eux n'exécute que le bloc qui le concerne. Après le "if", la suite du code est exécutée par les 2 processus.
 

Angelseb a écrit :


PS: dsl d'être si nul :D


Mieux vaut poser une question et paraître bête 30 sec. que de ne pas la poser et montrer que tu l'es durant toute ta vie.


Message édité par Sve@r le 26-11-2004 à 19:25:36
Reply

Marsh Posté le 05-12-2004 à 22:37:52    

ISTV en force !!!

Reply

Sujets relatifs:

Leave a Replay

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