Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/02/2013, à 17:26

Bloupies

Fork et fils

Bonjour

Je voudrais créer 4 processus de 3 façons différentes :

167130Capturedcran20130214161358.png

Voici mon main() :

int main()
{
	pid_t pid;

cerr<<"------avant le fork------"<<endl;

	pid = fork();

cerr<<"------apres le fork------"<<endl;

/* Si pid > 0 on est dans le processus pere
        pid = 0 processus fils
        pid < 0 le fork n'a pas fonctionne */
	if (pid > 0) {
   

       for (int i=0;i <11 ; i++)
	    cout << i << endl;
        cout<<"\tProcessus pere (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
		sleep(5);
			}
	else if (pid == 0){
	    for (int i=20;i <31 ; i++)
	    cout << i << endl;
		cout<<"\tProcessus fils valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
		sleep(5);
		}
	else
		cerr<<"Erreur a la creation du processus"<<endl;

cerr<<"------avant le return du main()------"<<endl;

return(0);
}

Donc le père affiche des entiers de 1 à 10 , et le premier fils de 10 à 20 .
Comment puis-je faire pour que le fils 1 affiche 10 à 20 , le fils2 de 20 à 30 , le fils3 de 30 à 40 ?

Pour l'une des façons ,c 'est à dire père -> fils1 -> fils2 -> fils3 , j'ai pensé rajouter au fils1 un fork , donc au fils de fils1 , c'est à dire fils2 , un nouveau fork ?

Enfin j'arrive pas à organiser tout ça

Merci d'avance


Modération : j’ai déplacé cette discussion dans une section plus appropriée.

Dernière modification par Shanx (Le 14/02/2013, à 18:38)

Hors ligne

#2 Le 14/02/2013, à 21:10

pingouinux

Re : Fork et fils

Bonjour,
J'essaierais comme ceci, mais je n'ai pas testé. Chaque fork génère un pere et un fils qui sont dans le même alignement.

Pour ton schéma en haut à gauche

fork()
pere
   print 1 à 10
   fork()
   pere
      fork()
      pere
         rien
      fils => fils3
         print 30 à 40
   fils => fils2
      print 20 à 30
fils => fils1
   print 10 à 20

Pour ton schéma en haut à droite

fork()
pere
   print 1 à 10
fils => fils1
   print 10 à 20
   fork()
   pere
      rien
   fils => fils2
      print 20 à 30
      fork()
      pere
         rien
      fils => fils3
         print 30 à 40

Pour ton schéma du bas

fork()
pere
   print 1 à 10
   fork()
   pere
      rien
   fils => fils3
      print 30 à 40
fils => fils1
   print 10 à 20
   fork()
   pere
      rien
   fils => fils2
      print 20 à 30

Hors ligne

#3 Le 14/02/2013, à 22:04

ssdg

Re : Fork et fils

Pour une version simple:
P=>(fils 1, fils2, fils3)
Fork=> si fils1 compter de 10 à 20, sinon fork => si fils2 compter de 20 à 30, sinon, fork => si fils3 compter de 30 à 40 sinon, compter de 0 à 10

Si tu comprends ça et que tu l'écris et l'indente proprement, faire tes autres configurations devrait être assez simple.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#4 Le 15/02/2013, à 10:14

Bloupies

Re : Fork et fils

salut

Celui de haut à gauche n'a pas l'air de fonctionner , du moins pour le fils3

#include <iostream>

//necessaire pour le fork (cf man) et le sleep
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>



using namespace std;
int status;

int main()
{
    pid_t pid;

cerr<<"------avant le fork------"<<endl;

    pid = fork();

cerr<<"------apres le fork------"<<endl;

/* Si pid > 0 on est dans le processus pere
        pid = 0 processus fils
        pid < 0 le fork n'a pas fonctionne */
    if (pid > 0) {
   
        for (int i=1;i <=10; i++)
        cout << i << endl;
        cout<<"\tProcessus pere (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
        pid=fork();
        sleep(5);}
   
            if (pid >0 ){
                pid=fork();
            
                    if (pid==0) {
                       
                            for (int i=30;i <=40; i++)
                                cout << i << endl;
                                cout<<"\tProcessus fils3 (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
                                sleep(5); }}
       
                                if (pid==0) {
                                   
                                    for (int i=20;i <=30; i++)
                                    cout << i << endl;
                                    cout<<"\tProcessus fils2 (valeur pid="<<pid<<"), getpid="<<getpid()<<" ,    getppid="<<getppid()<<endl;
                                    sleep(5); }
       
                                            if (pid==0) {
     
                                                for (int i=10;i <=20; i++)
                                                cout << i << endl;
                                                cout<<"\tProcessus fils1 (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
                                                sleep(5); }



return(0);
}
/* fork()
pere
   print 1 à 10
   fork()
   pere
      fork()
      pere
         rien
      fils => fils3
         print 30 à 40
   fils => fils2
      print 20 à 30
fils => fils1
   print 10 à 20 */

Hors ligne

#5 Le 15/02/2013, à 10:48

pingouinux

Re : Fork et fils

C'est parce que l'imbrication des forks n'est pas correcte. Voici une version corrigée.

#include <iostream>

//necessaire pour le fork (cf man) et le sleep
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>


using namespace std;
int status;

int main()
{
    pid_t pid;

cerr<<"------avant le fork------"<<endl;

    pid = fork();

cerr<<"------apres le fork------"<<endl;

/* Si pid > 0 on est dans le processus pere
        pid = 0 processus fils
        pid < 0 le fork n'a pas fonctionne */
    if (pid > 0) {
   
        for (int i=1;i <=10; i++)
        cout << i << endl;
        cout<<"\tProcessus pere (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
        pid=fork();
        sleep(5);
   
        if (pid >0 ){
            pid=fork();
        
                if (pid==0) {
                   
                        for (int i=30;i <=40; i++)
                            cout << i << endl;
                            cout<<"\tProcessus fils3 (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
                            sleep(5); }
        }
       
        else {
           
            for (int i=20;i <=30; i++)
            cout << i << endl;
            cout<<"\tProcessus fils2 (valeur pid="<<pid<<"), getpid="<<getpid()<<" ,    getppid="<<getppid()<<endl;
            sleep(5);
        }
       
    }
    else {
     
        for (int i=10;i <=20; i++)
        cout << i << endl;
        cout<<"\tProcessus fils1 (valeur pid="<<pid<<"), getpid="<<getpid()<<" , getppid="<<getppid()<<endl;
        sleep(5);
    }

return(0);
}

Hors ligne

#6 Le 15/02/2013, à 13:42

Bloupies

Re : Fork et fils

En effet merci , j essaie de faire les autres selon ton modèle .

Cependant , pourrais-tu me dire pourquoi le fils3 affiche getppid = 1 tandis que fils2 et fils1 affiche getppid=getpid du père ?

Hors ligne

#7 Le 15/02/2013, à 15:07

pingouinux

Re : Fork et fils

Bloupies  #6 a écrit :

Cependant , pourrais-tu me dire pourquoi le fils3 affiche getppid = 1 tandis que fils2 et fils1 affiche getppid=getpid du père ?

J'ai fait quelques tests. Il semble qu'on obtienne getppid=1 quand le processus correspondant est terminé.
En commentant tous les sleep(5), getppid==1 pour tous les fils.
En ajoutant sleep(20) avant return(0), getppid==getpid(pere) pour tous les fils.

Hors ligne

#8 Le 04/03/2013, à 15:17

ssdg

Re : Fork et fils

Euh, personne n'est intéressé par wait et waitpid ici?

(en gros, ça dit, j'attends la fin des fils ou d'un fils en particulier)

Dernière modification par ssdg (Le 04/03/2013, à 15:17)


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne