Variable commune avec un fork (linux)?

Variable commune avec un fork (linux)? - Programmation

Marsh Posté le 26-03-2001 à 18:24:39    

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.

Reply

Marsh Posté le 26-03-2001 à 18:24:39   

Reply

Marsh Posté le 26-03-2001 à 19:14:20    

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

Reply

Marsh Posté le 26-03-2001 à 19:31:12    

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

Reply

Marsh Posté le 26-03-2001 à 19:58:36    

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

Reply

Marsh Posté le 26-03-2001 à 20:19:30    

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

Reply

Marsh Posté le 26-03-2001 à 21:00:36    

//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!
Reply

Marsh Posté le 26-03-2001 à 21:06:40    

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 :)

Reply

Marsh Posté le 26-03-2001 à 21:21:02    

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().

Reply

Marsh Posté le 26-03-2001 à 21:24:48    

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 :) :)

Reply

Marsh Posté le 26-03-2001 à 21:29:37    

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)"

Reply

Marsh Posté le 26-03-2001 à 21:29:37   

Reply

Marsh Posté le 26-03-2001 à 21:36:14    

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.

Reply

Marsh Posté le 26-03-2001 à 21:42:43    

_Roswell a donné un exemple avec la shared memory.

Reply

Marsh Posté le 26-03-2001 à 21:47:22    

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

Reply

Sujets relatifs:

Leave a Replay

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