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

  FORUM HardWare.fr
  Programmation

  Variable commune avec un fork (linux)?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Variable commune avec un fork (linux)?

n°20561
NoBlue
Posté le 26-03-2001 à 18:24:39  profilanswer
 

Voilà mon pb :
Avoir une variable commune entre le "fils" et "père" avec un fork ?
exemple (allégé)
...
while(1)
{
x++;
fork()
case fils
          X--; //ceci n'est pas pri en compte par le père :(
case père
 
}
....
 
=> je veux avoir une variable commune entre le fils et le père ?
=> on m'a parlé de zone mémoire commune ou d'IPC ou ??
Help.

mood
Publicité
Posté le 26-03-2001 à 18:24:39  profilanswer
 

n°20574
krolours1
Posté le 26-03-2001 à 19:14:20  profilanswer
 

Il faut que tu utilise de la mémoire partagée et éventuellement un sémaphore pour gérer les problèmes d'accès concurents.
Regarde les pages de man de shmget et shmat (et aussi semget pour les sémaphores).
 
Une autre solution serait d'utiliser des threads qui eux partagent le même espace mémoire

n°20579
NoBlue
Posté le 26-03-2001 à 19:31:12  profilanswer
 

aie ça ce complique cette histoire.
Je vais essayer ta soluce krolours1 :)

n°20583
verdoux
And I'm still waiting
Posté le 26-03-2001 à 19:58:36  profilanswer
 

Sur les IPC unix:
http://www.ecst.csuchico.edu/~beej/guide/ipc/
 
Sur les threads POSIX (même si les threads de linux ne sont pas tout à fait POSIX):
http://centaurus.cs.umass.edu/~wag [...] orial.html

n°20587
SoWhatIn22
Posté le 26-03-2001 à 20:19:30  profilanswer
 

avec vfork(), ya aussi moyen de s'en sortir je pense.
En faire, en faisant ca, faut faire attention parce que le processus fils a le même espace d'adressage que le processus pere. Donc il peut y avoir des acces concurrent pour tout. A manipuler avec prudence, donc.
La mémoire partagée me semble préférable ;)

n°20590
Roswell_
Posté le 26-03-2001 à 21:00:36  profilanswer
 

//Prog ecrivain
#include<stdio.h>
#include<sys/ipc.h>
#define KEY 2001
 
main()
{
    int shmid;
 int i;
 char *shmadr;
 char **tab=(char **)malloc(2*sizeof(char *));
 /*variables sem*/
 int s;
 unsigned int ini[1];
 
 tab[0]="+++++";
 tab[1]="-----" ;
 ini[0]=1;
 
    if((shmid=shmget((key_t)KEY,512,IPC_CREAT|0666))==-1)
 {
  perror("IPC_CREAT" );
  exit(1);
 }
 else
 {
  shmadr=shmat(shmid,0,0);
  strcpy(shmadr,tab[0]);
  while(1)
  {
   strcpy(shmadr,tab[0]);
   strcpy(shmadr,tab[1]);
  }
  shmdt(shmadr);
  shmctl(shmid,IPC_RMID,0);
   
 }
}
 
//PRog lecteur
#include<stdio.h>
#include<sys/ipc.h>
#define KEY 2001
 
main()
{
    char *shmadr;
 char *str=(char *)malloc(255);
 int shmid;
 int count=0;
 int errCount=0;
 unsigned int ini[1];
 ini[0]=1;
    if((shmid=shmget((key_t)KEY,0,0))==-1)//512,IPC_CREAT|0666))==-1)
 //on pourrait mettre shmget((key_t)KEY,0,0); si on le lance apres le serveur.
 {
  perror("SHMGET" );
  exit(1);
 }
 else
 {
  shmadr=shmat(shmid,0,0);
  while(count<100)
  {
   p(s,0);
   strcpy(str,shmadr);
   v(s,0);
   if(!((!strcmp(str,"+++++" ))||(!strcmp(str,"-----" ))))
   {
    printf("%s\n",str);
    errCount++;
   }
   usleep(10);
   count++;
  }
  printf("\nPourcentage d'erreur: %d\n",errCount/1);
  shmdt(shmadr);
 }
}
 
On j'ai rien testé j'ai essaié de simplier un vieux gros n'exemple. En gros tu lances les 2 progs (d'abord l'écrivain) et il faut rajouter des semafores pour éviter les conflis.
Good luck


---------------
http://www.cheata.net le site qui vous donne la banane!
n°20591
NoBlue
Posté le 26-03-2001 à 21:06:40  profilanswer
 

SoWhatIn22 > trop fort ca me plait beaucoup ce vfork :)
Je teste ça, mercedi soir, là je suis en partiel :(
 
les semaphores ça me plait pas trop => sorry Roswell_
(j'ai fait ça en IUT et pas de bons souvenir)
 
Verdoux > je vais y jeter un oeil :)

n°20593
verdoux
And I'm still waiting
Posté le 26-03-2001 à 21:21:02  profilanswer
 

Sous linux:
| > vfork() differs from fork in that the parent is suspended  
| > until the child makes a call to execve(2) or _exit(2).  
| > The child shares all memory with its parent, including the  
| > stack, until execve() is issued by the child. The child  
| > must not return from the current function or call exit(),  
| > but may call _exit().

n°20594
NoBlue
Posté le 26-03-2001 à 21:24:48  profilanswer
 

merci Verdoux, si j'ai bien compris "The child shares all memory with its parent" = fils et père patagent meme espace mémoire
=> EXACTEMENT ce que je veux :) :)

n°20595
verdoux
And I'm still waiting
Posté le 26-03-2001 à 21:29:37  profilanswer
 

Pas sûr que ce soit ce que tu veux: "the parent is suspended until the child makes a call to execve(2) or _exit(2)"

mood
Publicité
Posté le 26-03-2001 à 21:29:37  profilanswer
 

n°20596
NoBlue
Posté le 26-03-2001 à 21:36:14  profilanswer
 

Merde c'est pas bon du tout ça :(
(le but c'est un client-serveur sous linux)
car en fait le père attend la connection d'un client
et après il y a creation du fils pour communiquer avec celui-ci.
Je suis deg si ca marche pas.

n°20600
verdoux
And I'm still waiting
Posté le 26-03-2001 à 21:42:43  profilanswer
 

_Roswell a donné un exemple avec la shared memory.

n°20601
NoBlue
Posté le 26-03-2001 à 21:47:22  profilanswer
 

ouais j'ai vu, si j'ai pas le choix mais je suis deg quand meme


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

  Variable commune avec un fork (linux)?

 

Sujets relatifs
[PHP]Ca marche la variable HTTP_ACCEPT_LANGUAGE sous IE5.5/win2000??problème carte xircom pcmcia sous linux ? qqun peut m'aider
Quel Linux ?pb de récup de valeur de variable sous flash 5
Update LinuxJe cherche des docs et tuts pour m'initier à mesa/opengl sous linux !
[C++/Linux] - Read bloquant : que faire ?javascript variable et opérateur
[C++] Appeler une variable située dans un .hComment jouer sur Linux ?
Plus de sujets relatifs à : Variable commune avec un fork (linux)?


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