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

 


Dernière réponse
Sujet : Variable commune avec un fork (linux)?
NoBlue ouais j'ai vu, si j'ai pas le choix mais je suis deg quand meme

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
NoBlue ouais j'ai vu, si j'ai pas le choix mais je suis deg quand meme
verdoux _Roswell a donné un exemple avec la shared memory.
NoBlue 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.
verdoux 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)"
NoBlue 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 :) :)
verdoux 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().
NoBlue 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 :)
Roswell_ //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
SoWhatIn22 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 ;)
verdoux 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
NoBlue aie ça ce complique cette histoire.
Je vais essayer ta soluce krolours1 :)
krolours1 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
NoBlue 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.

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