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

concernant les fork

shaken89
shaken89
Niveau 4
18 mars 2008 à 23:05:20

salut à tous je voudrais savoir ce qui se passe dans ce petit programme écrit en C:
int main()
{
int a=0,b=0;
pid_t fils1,fils2;
fils1=fork();
if(fils1==0)
{
b++;
printf("%d %d\n",a,b)
}
if(fils2==0)
{
a++;
b--;
printf("%d %d\n",a,b)
}

wait(NULL);
wait(NULL);
return 0;
}

Les variables sont elles réellement incrémentées(ou décrementées) même si le ++ ou le -- se trouvent dans le fork?

Merci d'avance

Pseudo supprimé
Pseudo supprimé 18 mars 2008 à 23:44:06

Alors écoute je n'ai pas encore étudié ça mais a priori je dirais que tu dois utiliser des pointeurs si tu veut que ça modifie le a et b de ton programme principale. :ok:

Ha et aussi, fait de l'indentation, c'est illisible :nah:

Blacksword
Blacksword
Niveau 10
18 mars 2008 à 23:46:19

Sans indentation, illisible. je saurais te repondre, seulement si tu indentes.
Au fait, pourquoi ne pas le compiler pour verifier ? :)

shaken89
shaken89
Niveau 4
18 mars 2008 à 23:52:44

int main()
{
int a=0,b=0;
pid_t fils1,fils2;
fils1=fork();
if(fils1==0)
{
b++;
printf("%d %d\n",a,b)
}
if(fils2==0)
{
a++;
b--;
printf("%d %d\n",a,b)
}

wait(NULL);
wait(NULL);
return 0;
}

//voilà les indentations

Pseudo supprimé
Pseudo supprimé 19 mars 2008 à 00:06:02

Ya pas de différence :non:

Tiens regarde, un de mes fichiers bien indenté:

  1. include <stdio.h>

int main() {
int tab[10];
tab[0] = 3;
tab[1] = 5;
tab[2] = 7;
int *pt = tab+1;
printf("%i\n", *pt);
return 0;
}

Tu vois un peu la mise en page?

Pseudo supprimé
Pseudo supprimé 19 mars 2008 à 00:06:43

Haaaa ok, JV fait sauter la mise en page :honte:

Blacksword
Blacksword
Niveau 10
19 mars 2008 à 00:07:15

Bon, apres examen rapide:
la fonction fork n'est pas donnee, donc dur de dire quoi que ce soit, vu que les incrementation/decrementations de a et b dependent de fils1 et fils2... or, fils1=fork(), et fork n'est pas donnee.
De meme, fils2 n'est pas donne.
Des lors... il doit manquer quelque chose, ca vient d'ou ca ?

chris_27
chris_27
Niveau 10
19 mars 2008 à 09:01:35

DarKwings : copie dans vim est gg=G :-)

Dargor
Dargor
Niveau 10
19 mars 2008 à 09:12:46

Wow, j'aurais appris comment indenter automatiquement dans vim :o))

Pour la question originale : les variables sont locales au programme exécuté, donc chaque fork aura sa propre copie. Donc elles seront incrémentées ou décrémentées dans le contexte du programme qui les modifie, mais les autres programmes ne verront pas ces modifications :)

chris_27
chris_27
Niveau 10
19 mars 2008 à 09:53:22

Blacksword : "la fonction fork n'est pas donnee" :d) tu ne confondrais pas le fork UNIX et le execv de Windows par hasard ?

Avec un fork UNIX, les deux processus (le papa, et le petit nouveau) vont tous les deux exécuter le code qui suit l'appel à fork(). D'où le test à l'aide du pid... :-)

Pseudo supprimé
Pseudo supprimé 19 mars 2008 à 15:20:27

E492: Commande inconnue: gg=G :nah:

chris_27
chris_27
Niveau 10
19 mars 2008 à 15:42:45

J'ai pas mis :gg=G, j'ai mis gg=G :-) (à faire en mode normal bien entendu)

Sinon, si tu préfères le mode visuel comme moi :
ggVG=

En réalité, c'est juste = pour indenter. Le gg est là juste pour s'assurer qu'on est au début du fichier, et le G est là pour dire qu'on indente jusqu'en bas du fichier.

Je ne connais pas de combinaison qui provoquerait l'indentation de tout le fichier à l'aide de = et % malheureusement. (si quelqu'un connaît, je suis preneur :hap: )

Pseudo supprimé
Pseudo supprimé 19 mars 2008 à 16:00:59

Ha d'accord, c'est bon, c'est ok. :hap:

N'empêche que le forum de JV massacre la mise en page :nah:

chris_27
chris_27
Niveau 10
19 mars 2008 à 16:08:00

En même temps, ça évite les rigolos qui flooderait à coup d'ascii-art. Avec ça en tête, je suis plutôt pour conserver le comportement actuel. :-)

Et puis, il y a http://pastebin.com/ les gens. :coeur:

Dargor
Dargor
Niveau 10
19 mars 2008 à 16:12:38

En même temps, ça évite les rigolos qui flooderait à coup d'ascii-art.

Mouais, ils le font quand même :honte:

N'empêche que le forum de JV massacre la mise en page :nah:

Une évolution est prévue dans ce domaine. Les ' ne sont plus changées en un caractère bizarre, c'est déjà çà :nah:

Pseudo supprimé
Pseudo supprimé 19 mars 2008 à 16:15:03

Mouais enfin bon ça doit être un sacré noob qui a codé ça :noel:

chris_27
chris_27
Niveau 10
19 mars 2008 à 16:22:35

Repartons sur un code regardable :

http://pastebin.com/m274ec350

shaken89: c'est quoi ton problème avec ce code ? :-)

chris_27
chris_27
Niveau 10
19 mars 2008 à 16:26:02

Hop... j'aurais mieux fait d'essayer de compiler mon code avant de le poster :o)) . Voici la version n°2 :

http://pastebin.com/m35025777

:honte:

Zratul
Zratul
Niveau 10
19 mars 2008 à 16:57:03

Bon si jme goure pas le prog fonctionne comme ça :

De base tu as a et b = 0.

Tu fais récupères la valeur de fork dans le pid_t fils1.

A ce niveau tu as 2 "processus" qui tournent.
Le processus père qui est le programme que tu as lancé.
Un processus fils qui a été crée au moment de l'appel de fork() et qui hérite de tout le code qui se trouve après.

Le processus père aura dans le pid_t fils1 une valeur un peu bizarre qui sera l'identifiant du processus fils qui a été crée.
Le processus fils aura son pid_t à 0.

Ensuite voilà ce qui se passe pour le processus père :
Premier If, son pid_t fils1 est différent de zéro puisqu'il contient l'id de son fils. DOnc on zappe le bloc.
Deuxième if, de même.
La y a un wait(NULL), si jme souviens bien il va se mettre en attente jusqu'à ce que ses fils soient terminés (bref même si me goure c'est pas très important ici).

Pour le processus fils qui a été crée :
premier if, son pid_t fils1 vaut bien 0 puisqu'il est le processus qui a été crée à ce moment là. Donc il entre dans la boucle.
b est incrémenté et vaut désormais 1.
Puis y a le printf qui va donc afficher "0 1" car a vaut 0 et b vaut 1.

Il ne rentre pas dans le 2eme if vu que pid_t fils2 est vide.

Il attend et doit surement se terminer.

Puis le processus père se termine à son tour.

Zratul
Zratul
Niveau 10
19 mars 2008 à 17:01:00

Au final t'as bien eu un printf "0 1" qui a été affiché dans la console et qui est du au processus fils. Cependant saches que pour le processus père, a et b n'ont pas été modifiés et ont toujours valu 0 jusqu'à la fin du programme.

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