Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 71 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Besoin d'aide pour faire tourner 2 processus en même temps !

 
n°7304
Lipao17
je panse donc j'essuie ...
Profil : Jeune recrue
Posté le 04-04-2004 à 16:34:01  profilanswer
 

Helloooooooo
 
Voilà je cherche à faire tourner 2 processus en même temps :  
 
en fait je veux que mon programme "discute" avec une autre machine (qu'il s'y connecte et qu'il lui envoi des infos) pendant que je fais autre chose (me balader dans un menu)!!
 
j'ai pour l'instant 2 progammes :  
 
=> le 1er pour qu'il "discute" avec une autre machine : c'est à dire qu'il envoi à un serveur le message "wazzzzaaaaaaa" toutes les 4 secondes !!

Code :
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. #define MAX_READ 50
  8. #define NOM_SERVEUR "ordinateur_de_PoichGoaL"
  9. #define PORT_SERVEUR 5681
  10. void programme1(){
  11. int i,res_socket,res,res_connect,res_write,res_read,res_close;
  12. char nom_serveur [MAX_READ]=NOM_SERVEUR;
  13. char message[MAX_READ]="wazzzzaaaaaaa";
  14. char ping[21];
  15. struct sockaddr_in mon_adresse,adresse_serveur;
  16. struct hostent *info_adr;
  17. /*****************************************************************************************
  18.                               CREATION DE LA SOCKET
  19. *****************************************************************************************/
  20. res_socket=socket(AF_INET,SOCK_STREAM,0);
  21. if(res_socket==-1){
  22.       printf("Erreur dans la creation du socket\n" );}
  23. else{
  24.       printf("Creation de la socket ok : res_socket : %d\n",res_socket);}
  25. /*****************************************************************************************
  26.                          RECUPERATION DE L'ADRESSE DU SERVEUR
  27. *****************************************************************************************/
  28. bzero(&adresse_serveur,sizeof(adresse_serveur));
  29. info_adr=gethostbyname(nom_serveur);
  30. adresse_serveur.sin_family=AF_INET;
  31. adresse_serveur.sin_port=htons(PORT_SERVEUR);
  32. bcopy(info_adr->h_addr,&adresse_serveur.sin_addr.s_addr,info_adr->h_length);
  33. /*****************************************************************************************
  34.                                          CONNECT
  35. *****************************************************************************************/
  36. res_connect=connect(res_socket,(struct sockaddr *)&adresse_serveur,sizeof(adresse_serveur));
  37. if(res_connect==-1){
  38.                     perror("Erreur dans le connect\n" );}
  39. else if(res_connect=0){
  40.                     printf("connect ok..\n" );}
  41. /*****************************************************************************************
  42.                                         MESSAGE
  43. *****************************************************************************************/
  44. while(message[0]!='.'){
  45.    res_write=write(res_socket,message,strlen(message));
  46.    printf("\nNombre de caractere transmis : %d\n",res_write);
  47.    fflush(stdout);
  48.    sleep(4);
  49. }
  50. printf("\nFin de la communication ... \n" );
  51. /*****************************************************************************************
  52.                              FERMETURE DE LA SOCKET  
  53. *****************************************************************************************/         
  54. printf ("\n\n\nFERMETURE DE LA SOCKET\n" );
  55. res_close=close (res_socket);
  56. if(res_close==-1){
  57.                    printf("Erreur lors de la fermeture de la socket\n" );}
  58. else if(res_close==0){
  59.                    printf("\n\n...\n" );}
  60. return 0;
  61. }


 
 
=> le 2ème me permet de me balader dans un menu pour faire des trucs simples (affichage, tri,...)

Code :
  1. void programme2()
  2. {
  3. int choix_menu;
  4. do
  5.   {
  6.            printf ("   1 -  menu1\n" );
  7.            printf ("   2 -  menu2\n" );
  8.            printf ("   3 -  menu3\n" );
  9.            printf ("   4 -  Quit\n" );
  10.          
  11.            printf ("\n\n%sentrer votre choix :);
  12.            scanf("%d",&choix_menu);
  13.       switch(choix_menu){
  14.          case 1 :   menu1();
  15.                     break;
  16.          case 2 :   menu2();
  17.                     break;
  18.          case 3 :   menu3();
  19.                     break;
  20.          case 4 :   quit();
  21.                     break;
  22.       }
  23.   }while(choix_menu!=5 || choix_menu<1); 
  24. }


 
 
Donc ce que j'aimerai c'est que ces 2 programmes tournent en même temps, le programme1 se connecte à un serveur et envoi un message (mais que je ne vois pas ce qui se passe). Moi je veux voir le programme2 et me balader dans le menu. Je pense donc que je dois utiliser 2 processus mais je ne sais pas trop comment faire. Quelqu'un aurait une idée ??
 
Je ne sais pas si j'ai été bien clair, et merkkiiiiii à ceux qui pourront m'aider


Message édité par Lipao17 le 04-04-2004 à 16:36:18

---------------
Comme ils disent à Varsovie :
"boire ou conduire ...
 
... de toutes façons on a pas de voiture !!"
n°7305
tifrere
Junos power
Profil : Dinosaure
Posté le 04-04-2004 à 18:45:32  profilanswer
 

man fork


---------------
Speed, Quality, Price ... pick any two
n°7306
tifrere
Junos power
Profil : Dinosaure
Posté le 04-04-2004 à 18:48:30  profilanswer
 

http://cui.unige.ch/~oriol/Teachin [...] de127.html


---------------
Speed, Quality, Price ... pick any two
n°7311
airv3
Coach de la Montgalorette
Profil : Vieux de la vieille
Posté le 04-04-2004 à 19:48:55  profilanswer
 

tifrere a écrit :

man fork


+1 mais faut que tu pense que les process ne tourneront jamais en même tps tu auras l'impression
mais chacun utilisera des ressource du  precesseur les un après les autre te donnant l'illusion kil tourne en même teps ;)

n°7312
Lipao17
je panse donc j'essuie ...
Profil : Jeune recrue
Posté le 05-04-2004 à 00:16:29  profilanswer
 

Avec mon prof de C j'avais vu un programme avec un fork :
 
 

Code :
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #define ITER_PERE 2000
  4. #define ITER_FILS 2000
  5. main ()
  6. {
  7. int pid, i;
  8.   if ((pid=fork ()) == 0)
  9.    {                              /* CODE DU FILS */
  10.     for (i=1;i<=ITER_FILS;i++)
  11.       {
  12.        printf ("                           FILS, mon pid est %d\n",
  13. getpid());
  14.        printf ("                                Le pid  de mon pere est %d\n", getppid());
  15.        fflush (stdout);
  16.       }
  17.    }
  18.   else if (pid>0)                  /* CODE DU PERE */
  19.           for (i=1;i<=ITER_PERE;i++){
  20.               printf ("PERE, mon pid est %d\n", getpid());
  21.               printf ("     Le pid  de mon fils est %d\n", pid);
  22.           }
  23.            else printf ("ERREUR FORK\n" );
  24. }


 
Seulement je le comprends pas trop !!  on créer ici 2 processus non ?  
mais ils tournent chacun leur tour non ??  
 
 
où est ce que je dois mettre programme1() et programme2() ??
 
 
Merci de votre aide


---------------
Comme ils disent à Varsovie :
"boire ou conduire ...
 
... de toutes façons on a pas de voiture !!"
n°7330
airv3
Coach de la Montgalorette
Profil : Vieux de la vieille
Posté le 06-04-2004 à 03:08:15  profilanswer
 

si ton prof t'as montré le fork c que vous avez du le voir en cours.. toi t'ecoute pas bien les cours... et lis ce ke je  t'ai ecris précédemment et tu sur google tu tapes fork et tu trouveras les meilleirs explications possibles... mais si tu comprends pas le fork tu comprendra jamais comment faire tourner 2 process "en même tps" (parce ke ca tournera jamais en même tps)

n°7352
tifrere
Junos power
Profil : Dinosaure
Posté le 07-04-2004 à 20:56:29  profilanswer
 

un peu porc le programme
 
en général on fait plutot un  
switch(lepid=fork())


Message édité par tifrere le 07-04-2004 à 20:56:37

---------------
Speed, Quality, Price ... pick any two
n°7372
myst
nono powered ©
Profil : Vieux de la vieille
Posté le 08-04-2004 à 18:45:26  profilanswer
 

tu testes une variable qui prend 2 valeurs possibles : soit "0" soit "non 0"...
quel est l'interet d'utiliser un switch???
dans ce cas, un simple if else comme c'est le cas ici suffit amplement...

n°7385
tifrere
Junos power
Profil : Dinosaure
Posté le 10-04-2004 à 10:16:03  profilanswer
 

il peux avoir 3 valeurs :  
une pour dire ke c le fils
une pour dire ke c le père
un pour dire ke le fork a foiré
 
dans tous les cours de C que j'ai eu durant 2 ans de DUT on a toujours eu des switch pour les fork
 
bref a vous de voir comment vous programmez après


---------------
Speed, Quality, Price ... pick any two
n°7386
airv3
Coach de la Montgalorette
Profil : Vieux de la vieille
Posté le 10-04-2004 à 13:07:04  profilanswer
 

tifrere a écrit :

il peux avoir 3 valeurs :  
une pour dire ke c le fils
une pour dire ke c le père
un pour dire ke le fork a foiré
 
dans tous les cours de C que j'ai eu durant 2 ans de DUT on a toujours eu des switch pour les fork
 
bref a vous de voir comment vous programmez après


le fils = 0
le père > 0 (dans le switch ca sera le default)
fork a foiré = -1


---------------
La surprise du petit Chkonk est attendu Hall "Coin de la ruelle" porte des "400 pseudos"
En Sicile, la femme est plus dangereuse que les fusils...
Des mecs comme lui y en a pas
n°7388
myst
nono powered ©
Profil : Vieux de la vieille
Posté le 10-04-2004 à 14:21:13  profilanswer
 

tifrere a écrit :

il peux avoir 3 valeurs :  
une pour dire ke c le fils
une pour dire ke c le père
un pour dire ke le fork a foiré
 
dans tous les cours de C que j'ai eu durant 2 ans de DUT on a toujours eu des switch pour les fork
 
bref a vous de voir comment vous programmez après


peut etre mais bon, à ce stade de la programmation, aucune methode n'est plus propre ou plus efficace que l'autre...
ca reste ultra simple et c'est pas comme si il faisait 10 if d'affilee...
m'enfin bon...  :sarcastic:

n°7391
tifrere
Junos power
Profil : Dinosaure
Posté le 10-04-2004 à 16:00:59  profilanswer
 

10 if d'affilée je trouve ca crade (c pas pour rien ke le switch existe)
pour moi dès qu'une variable peux prendre plus de 2 valeurs c switch sinon c if-else


Message édité par tifrere le 10-04-2004 à 16:01:52

---------------
Speed, Quality, Price ... pick any two
n°8073
krees
Profil : Membre
Posté le 21-05-2004 à 15:52:30  profilanswer
 

Faîtes gaffe à la façon d'utiliser le fork() les keums : si on ne fait pas gaffe on crée des processes zombie.
 
Il faut que A forke et crée B, puis attende sa mort par wait(). Lui, B, forke à son tour pour créer C. B N'attend pas C par wait mais exit() direct => le wait de A est satisfait car B est mort. Et comme C n'a pas (plus) de père, il n'y a pas de zombie à la fin du precessus C. Ceci permet de faire fonctionner A et C en parallèle (car si A forke B et ne fait pas de wait() alors B sera zombie quand il terminera; par contre si A fait un wait sur B alors A est bloqué; c'est comme si A appelait la fonction B() contenant l'intégralité du process B ! (pas de parallélisme))


---------------
He who dares gets :sol: Le plus beau :sol: La plus belle
n°8074
ollone
Part of the 'One brothers
Profil : Vieux de la vieille
Posté le 21-05-2004 à 16:03:53  profilanswer
 

intéressant :jap:

n°8123
hoover
Mode Thermique
Profil : Membre
Posté le 22-05-2004 à 13:28:09  profilanswer
 

Krees a écrit :

Faîtes gaffe à la façon d'utiliser le fork() les keums : si on ne fait pas gaffe on crée des processes zombie.
 
Il faut que A forke et crée B, puis attende sa mort par wait(). Lui, B, forke à son tour pour créer C. B N'attend pas C par wait mais exit() direct => le wait de A est satisfait car B est mort. Et comme C n'a pas (plus) de père, il n'y a pas de zombie à la fin du precessus C. Ceci permet de faire fonctionner A et C en parallèle (car si A forke B et ne fait pas de wait() alors B sera zombie quand il terminera; par contre si A fait un wait sur B alors A est bloqué; c'est comme si A appelait la fonction B() contenant l'intégralité du process B ! (pas de parallélisme))


 
Le wait permet surtout de synchroniser les processus : pere - fils et plus généralement permet de synchroniser toute la descendance...
Si un processus zombie est créé, il est rattrapé par le processus init donc pas de panik  :D

n°8124
hoover
Mode Thermique
Profil : Membre
Posté le 22-05-2004 à 13:32:27  profilanswer
 

airv3 a écrit :


le fils = 0
le père > 0 (dans le switch ca sera le default)
fork a foiré = -1


 
le pere recoit (plus precisement) le pid de son fils, effectivement forcement > 0

n°14885
krees
Profil : Membre
Posté le 04-10-2005 à 13:53:45  profilanswer
 

hoover: ce que je dis est issus de cours. Ça se trouve donc sur google. Si un même process fork plusieurs fois au cours de sa vie, en instanciant des fils dont la vocation est de mourir avant leur père (snif) alors on crée une avalanche de zombies.
 
Et le processus init ne fait pas tout ! En production on a eu le cas, avec une chiée de zombies hallucinante !
 
Passer par la méthode que j'ai décrite évite ce pb sur un processus qui vit plusieurs jours (voire mois) durant et forke toutes les 30 secondes en journée pour traiter une pending list alimentée en asynchrone par écoute sur socket et stockage à la volée dans la pending list; le process fils devient consommateur asynchrone du processus père, producteur.
 
La méthode est amplement décrite sur des sites à vocation pédagogique d'ailleurs...


Message édité par krees le 04-10-2005 à 13:56:17

Aller à :
Ajouter une réponse