CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Pb Gestion de processus

gokusnake
gokusnake
Niveau 7
14 avril 2006 à 20:30:01

Salut à tous, voici mon pb:

Quand je lance un nouveau processus avec fork(), et que je modifie une même variable dans le processus fils et dans le processus père, les deux processus ne travaille pas sur la même variable, chacun travaille sur la valeur initiale de la variable sans prendre en compte les modification de l´autre processus.

Quelle en est l´explication?

Est-ce parceque le processus père se "duplique" et duplique sa variable lors de l´appel à fork()?

merci par avance. @+

dnob700
dnob700
Niveau 10
14 avril 2006 à 22:23:21

oui, en terminologie windows fork crée un nouveau processus, c´est à dire que toute la mémoire du premier est répliqué, les handle sont hérité par le processus fils, mais à partir de là, il travaille sur des variables différentes.

Pour communiquer entre deux processus, il faut utiliser des mutex par exemple.

L´autre solution est de créer un thread ou processus leger. Pour celà, sous linux et Cie, il faut utiliser pthread_create je crois.
La différence avec fork est qu´il faut lui fournir une fonction à partir de laquelle le nouveau thread (terminologie windows) va débuter.

gokusnake
gokusnake
Niveau 7
15 avril 2006 à 08:30:57

ok, merci, mais j´ai réalisé ce programme sous Linux, quelle est la différence avec windows?

Sinon, justement, j´ai essayer ce code sous windows et il me dis:

sys/wait.h: No such file or directory.

Est-ce propre à Linux ou suffit il d´importer cette bibliothèque?

@+

dnob700
dnob700
Niveau 10
15 avril 2006 à 13:49:05

ce que je t´ais dit (ptread-create) fonctionne sous linux seulement.

Mais c´est effectivement propre à linux. Sous windows, même s´il existe des fonctions permettant de copier l´interface de Linux, il vaut mieux utiliser CreateThread ou CreateThreadEx qui se trouve dans windows.h. Mais les en-tête de type sys/truc.h sont quasiment tous spécifique à linux.

JeanYvesYves
JeanYvesYves
Niveau 10
15 avril 2006 à 14:23:51

faire 2 processus (sous windows ou Linux), c´est faire 2 programmes distincts : sans variables en commun. Le seul moyen de communiquer, c´est d´utiliser des "pipes"

Sinon, pour faire ce que tu fais, utilises des "processus légers" : qu´on appelle plus couramment threads :)

gokusnake
gokusnake
Niveau 7
15 avril 2006 à 15:37:29

ok merci pour ces réponses.

Pendant que j´y suis, je ne vais pas m´arrêter en si bon chemin :)

Je fais un fork dans une boucle for qui varie de 0 à 3,donc je suis censé creer 3 processus, cependant, j´en créer beaucoup plus.

C´est pourquoi j´ai mis la condition si fork>0
on exécute le code sinon exit.

A présent, ça me créé bien 3 processus, mais apparemment ce sont tous les memes, car quand j´affiche leur pid et ppid, ils ont la meme valeur pour les 3 processus.

Je ne comprend donc pas, si j´ai bien créé 3 processus, pourquoi est-ce les meme.

Est-ce parceque je "tue" les fils crées et je ne garde que le pere à chaque fois?

merci par avance pour vos réponses.@+

dnob700
dnob700
Niveau 10
15 avril 2006 à 16:02:31

c´est la fonction fork elle même qui renvoie le pid interessant. Je crois que ça renvoie 0 pour le fils (ou le contraire) et le véritable pid du processus créé pour le père.

gokusnake
gokusnake
Niveau 7
15 avril 2006 à 16:13:50

Je sais, ça renvoie 0 si c´est le processus fils, >0 si c´est le processus pere (ça correspond au pid de son fils), et -1 en cas d´erreur.

Cependant, je ne comprend pas. :snif:

dnob700
dnob700
Niveau 10
15 avril 2006 à 19:11:07

qu´est ce que tu ne comprend pas ?

si tu veux plus d´aide, colle ici le code que tu utilise, sinon on ne peut pas vraiment t´expliquer ce que tu fait exactement.

gokusnake
gokusnake
Niveau 7
15 avril 2006 à 20:21:10

Prenons cet exemple:

int main(int argc, char ** argv){
int i;
for(i=0; i < atoi(argv[1]); i++){
if(fork()>0) printf("salut, je suis le processus n°: %d, mon pid est: %d, mon ppid est: %d \n", i, getpid(), getppid());
else exit(0);
}
}

/*
bash-3.00$ ./a.out 3
salut, je suis le processus n: 0, mon pid est: 30492, mon ppid est: 5442
salut, je suis le processus n: 1, mon pid est: 30492, mon ppid est: 5442
salut, je suis le processus n: 2, mon pid est: 30492, mon ppid est: 5442

  • /

cela me creer bien trois processus mais tous identique, étant donné qu´ils ont le meme pid, donc en fait j´en ai créé qu´un seul?

De plus, au début, j´avais fais ça:

int main(int argc, char ** argv){
int i;
for(i=0; i < atoi(argv[1]); i++){
fork();
}
}

Et ça m´a créé je crois 7 processus.

Mais je ne comprend pas vraiement pourquoi.

dnob700
dnob700
Niveau 10
15 avril 2006 à 21:07:25

quele premier soit toujours le même processus, c´est normal, puice que celui où fork()>0 c´est le père. Donc c´est toujours le père qui parle et pas le fils (sans compter que le père est le numéro 0 et que les trois suivant sont les 1,2 et 3).

et en bas, c´est très logique : chaque processus créé est lui même dans une boucle for et va créer plein d´autreprocessus. Au final ça te fait pas mal de processus (ça doit être facile à compter).

gokusnake
gokusnake
Niveau 7
16 avril 2006 à 21:11:25

mouai, ok.

Pour le premier exemple, y´a t´il une autre maniere de faire?

Merci, @+

dnob700
dnob700
Niveau 10
16 avril 2006 à 21:14:01

oui, tu fait :
int f=fork();
if (f==0)
...

au lieu de if (f>0)

Et il faut sortir le fork du test, car je crois avoir lu que le comportement est indeterminé sinon (le test pourrait être ré-évalué sinon, je crois).

guyver2
guyver2
Niveau 10
19 avril 2006 à 15:21:25

pour differencier le pere du fils apres un fork, tu fais :

...
int pid = fork();
// ici tu as deux processus qui vont executer la s
uite du code
//pour le pere pid > 0 pour le fils pid == 0 donc
if (pid > 0)
{
// code pour le pere
}
else
{
//code pour le fils
exit(0);
}

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment