OVH Cloud OVH Cloud

fork. partage de variable.

5 réponses
Avatar
Guillaume Desticourt
bonjour,

je cherche a partager une variable de type int entre deux processus
forkes. comme fork duplique les variables, je me suis dit que
j'allais utiliser un int *. j ai ecrit ca:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int *share;

int main(void)
{
pid_t pid;
int a, status;

a = 1;
share = &a;
if ((pid = fork()) < 0)
exit(EXIT_FAILURE);
/* fils */
if (!pid)
{
*share = 2;
printf("fils: *share = %d\n", *share);
exit(EXIT_SUCCESS);
}
waitpid(pid, &status, 0);
/* pere */
printf("pere: *share = %d\n", *share);
return 0;
}

mais:
guillaume@fallen:/tmp$ ./test
fils: *share = 2
pere: *share = 1

quelqu un peut il m indiquer mon errreur (et si possible me dire
comment faire passer la valeur de mon int du fils au pere)?

merci d'avance,

--
Guillaume Desticourt

5 réponses

Avatar
DINH Viêt Hoà

je cherche a partager une variable de type int entre deux processus
forkes. comme fork duplique les variables, je me suis dit que
j'allais utiliser un int *. j ai ecrit ca:


fork() ne fait pas que dupliquer les variables, il duplique plutôt les
segments de données, tas, pile.

Si tu cherches à partager une variable entre deux processus créés avec
fork, il vaut mieux partager la valeur en utilisant un pipe pour
communiquer entre eux ou un segment de mémoire partagée.

Mais je suppose que ce que tu cherches à obtenir est la notion de
thread, c'est-à-dire, des processus qui partagent les segments de
données (mais pas la pile), donc les variables que les threads modifient
sont les mêmes.

voir pthread_create() pthread_join()

ainsi que tout ce qui est synchronisation de processus.

par exemple :
pthread_mutex_init()
pthread_mutex_lock() pthread_mutex_unlock()
pthread_mutex_destroy()

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan

Avatar
Laurent Wacrenier
Guillaume Desticourt écrit:
je cherche a partager une variable de type int entre deux processus
forkes. comme fork duplique les variables, je me suis dit que
j'allais utiliser un int *. j ai ecrit ca:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


#include <sys/mman.h>


int *share;

int main(void)
{
pid_t pid;
int a, status;


share = mmap(NULL, sizeof(int), PROT_WRITE|PROT_READ,
MAP_ANON|MAP_SHARED, -1, 0);



a = 1;
share = &a;


*share = 1;

Attention aux accès concurents. l'écriture et la lecture ne sont pas
garanties atomiques (mais ça devrait s'arranger avec des sig_atomic_t)

Avatar
Guillaume Desticourt
la memoire partagee avec mmap, n est pas utilisable pour mon probleme,
car les donnees que je dois partager sont variables. je dois de plus
pouvoir modifier l environnment du pere (setenv).
pour les threads, le probleme est que je dois faire des execv
regulierement, et on me dit que il vaut mieux eviter de conjuguer
threads et execv. (si mes souvenirs ne sont pas trop mauvais, execv
ecrase tout, qu'advient il alors des variables communes aux deux
threads?)
bref je pense regler ca en deplacant certains traitements avant de
forker... au pire avec un pipe.

merci pour vos explications,

--
Guillaume Desticourt
Avatar
DINH Viêt Hoà

pour les threads, le probleme est que je dois faire des execv
regulierement, et on me dit que il vaut mieux eviter de conjuguer
threads et execv. (si mes souvenirs ne sont pas trop mauvais, execv
ecrase tout, qu'advient il alors des variables communes aux deux
threads?)


le comportement d'exec() combiné avec les threads est spécifié.
en cas d'exec(), les threads existant dans le programme en cours sont
arrêtées.

Comme en général, tu fais un fork() avant un exec() et que fork() ne
duplique pas les threads, je ne vois pas le problème que cela pose.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan

Avatar
Guillaume Desticourt
DINH Viêt Hoà writes:


pour les threads, le probleme est que je dois faire des execv
regulierement, et on me dit que il vaut mieux eviter de conjuguer
threads et execv. (si mes souvenirs ne sont pas trop mauvais, execv
ecrase tout, qu'advient il alors des variables communes aux deux
threads?)


le comportement d'exec() combiné avec les threads est spécifié.
en cas d'exec(), les threads existant dans le programme en cours sont
arrêtées.

Comme en général, tu fais un fork() avant un exec() et que fork() ne
duplique pas les threads, je ne vois pas le problème que cela pose.
ok. j avais pense remplacer mon fork par des threads. je vois a ta

reponse que ce n est pas ca. il faudrait fork + thread. Mais pour mon
probleme precis il m a suffit de deplacer le traitement des donnees a
partager avant de forker -ca semble bete a dire mais...

merci pour la precision,

--
Guillaume Desticourt