Variable commune avec un fork (linux)? - Programmation
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
Marsh Posté le 26-03-2001 à 19:31:12
aie ça ce complique cette histoire.
Je vais essayer ta soluce krolours1
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
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
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
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
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().
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
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)"
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.
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
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.