IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

deux processus avec fork() différents


Sujet :

POSIX C

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut deux processus avec fork() différents
    bonjour;
    alors je veux créer deux processus différents (l'un fait l'addition l'autre la multiplication) mais chaque fils ecrase le le code du père , j'ai essayé ça mais ça donne des tas d'erreurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
     
    /*********************************/
    /*			ADDITION	 		 */
    /*********************************/
    int Add(int x,int y){
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils addition: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = x + y;
    				return Res;
    				exit(0);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				wait();
    			}
    }
    /*********************************/
    /*		 MULTIPLICATION 		 */
    /*********************************/
    float Mult(float f,float g){
    	int Res
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils multiplication: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = f * g;
    				return Res;
    				exit(0);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				wait();
    			}
    }
    /*********************************/
    /*			   MAIN 			 */
    /*********************************/
    main(){
    	int P;
    	int x,y;
    	float f,g;
    	float resultat;
    	char choix;
     
    	printf("Donner votre choix (addition/multiplication): A/M");
    	scanf(choix);
     
    	switch (choix){
    		case 'a': 
    			printf("donner deux entiers:");
    			scanf(x,y);
    			resultat = Add(x,y);
    			break;
     
    		case 'm':
    			printf("donner deux reels:");
    			scanf(f,g);
    			resultat = Mult(f,g);
    			break;
     
    		default:
    			printf("faux caractere!");
    	}
     
    }

  2. #2
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    J'aimerais comprendre pourquoi vous essayer de faire un fork() dans les fonctions respectives ( addition & multiplication) ?
    Ce que moi j'ai compris, c'est que vous souhaiter exécuter par le fils une addition et le père une multiplication et dans ce cas en pourrait très bien écrire:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
     
    int f_Exe( const pid_t id, const int x, const int y ){
    	return( ( id == 0) ? (x+y) : (x*y) );
    }
     
    int main( void ){
     
    	int x = 10;
    	int y = 10;
    	pid_t id = fork();
     
    	if( (0) == id )
    		printf("(Fils)\t:%d\n", f_Exe(id, x, y) );
    	else
    		printf("(Père)\t:%d\n", f_Exe(id, x, y) );
     
    	return( EXIT_SUCCESS );
    }
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    d'abord, l'exercice demande d'exécuter deux processus selon le cas (soit addition ou multiplication) et leurs variables sont de différents types comme vous le voyez, et il faut qu'il y ait deux fils mais le père lit les variables et affiche le résultat seulement

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    d'abord, l'exercice demande d'exécuter deux processus selon le cas (soit addition ou multiplication) et leurs variables sont de différents types comme vous le voyez, et il faut qu'il y ait deux fils mais le père lit les variables et affiche le résultat seulement
    D'abord "bonjour" et ensuite je pense n'avoir pas compris concrètement ce que l'on vous demande de faire, pourriez-vous être plus précis quant à la description de l'énoncer qui vous a été fournie.
    Quant aux types de variable différents, une union fera très bien l'affaire et ça l'avantage de regrouper les donnés en des seuls espaces mémoire.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    je sais ce que vous dite mais c'est ce que demande mon exercice pour que nous apprennions à créer deux processus qui offrent deux services différents c'est là le but et non pas de faire un simple calcul, vous voyez?
    j'ai refais quelques lignes voilà le nouveau code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    /*********************************/
    /*			CALCULATRICE 		 */
    /*********************************/
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
     
    /*********************************/
    /*			ADDITION	 		 */
    /*********************************/
    int Add(int x,int y){
    int Res;	
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils addition: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = x + y;
    				exit(Res);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				//wait();
    			}
    }
    /*********************************/
    /*		 MULTIPLICATION 		 */
    /*********************************/
    float Mult(float f,float g){
    	float Res;
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils multiplication: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = f * g;
    				exit(Res);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				//wait();
    			}
    }
    /*********************************/
    /*			   MAIN 			 */
    /*********************************/
    main(){
    	int P;
    	int x,y;
    	inr resultat1;
    	float f,g;
    	float resultat2;
    	char choix;
     
    	printf("Donner votre choix (addition/multiplication): A/M");
    	scanf(choix);
     
    	switch (choix){
    		case 'a': 
    			printf("donner deux entiers:");
    			scanf(x,y);
    			Add( x, y);
    			printf("resultat =" , wait(resultat1) );
    			break;
     
    		case 'm':
    			printf("donner deux reels:");
    			scanf(f,g);
    			Mult(f,g);
    			printf("resultat =" , wait(resultat2) );
    			break;
     
    		default:
    			printf("faux caractere!");
    	}
     
    }

  6. #6
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    je sais ce que vous dite mais c'est ce que demande mon exercice pour que nous apprennions à créer deux processus qui offrent deux services différents c'est là le but et non pas de faire un simple calcul, vous voyez?
    j'ai refais quelques lignes voilà le nouveau code:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    
    /*********************************/
    /*			CALCULATRICE 		 */
    /*********************************/
    
    #include<stdlib.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    
    /*********************************/
    /*			ADDITION	 		 */
    /*********************************/
    int Add(int x,int y){
    int Res;	
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils addition: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = x + y;
    				exit(Res);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				//wait();
    			}
    }
    /*********************************/
    /*		 MULTIPLICATION 		 */
    /*********************************/
    float Mult(float f,float g){
    	float Res;
    	pid_t P = fork();
    			if(P == 0){
    				printf("je suis le fils multiplication: PID = %d", getpid() );
    				printf("mon pere: PID = %d", getppid() );
    				Res = f * g;
    				exit(Res);
    			}else if(P < 0){
    				printf("FORK a echoue");
    				exit(1);
    			}else{
    				printf("je suis le pere : PID = %d", getpid() );
    				printf("mon fils: PID = %d", P );
    				//wait();
    			}
    }
    /*********************************/
    /*			   MAIN 			 */
    /*********************************/
    main(){
    	int P;
    	int x,y;
    	inr resultat1;
    	float f,g;
    	float resultat2;
    	char choix;
    	
    	printf("Donner votre choix (addition/multiplication): A/M");
    	scanf(choix);
    	
    	switch (choix){
    		case 'a': 
    			printf("donner deux entiers:");
    			scanf(x,y); 			
                            Add( x, y);
    			printf("resultat =" , wait(resultat1) );
    			break;
    			
    		case 'm':
    			printf("donner deux reels:");
    			scanf(f,g);
    			Mult(f,g);
    			printf("resultat =" , wait(resultat2) );
    			break;
    			
    		default:
    			printf("faux caractere!");
    	}
    	
    }
    D'accord mais au final vos services font bien des opérations élémentaires ?
    Cependant j'ai remarqué des erreurs dans ton code surtout sur la fonction de saisie, penses-tu que ton programme compile correctement ?.
    En attendant je poste la variante ci-dessous de ce qui me semble être ce que tu souhaites réaliser
    à bientôt
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
     
    int main( void ){
     
    	int x = 10;
    	int y = 10;
    	int i = 0;
    	pid_t id;
     
    	/* 	(0) addition & (1) Multiplication	*/
    	scanf( "%d", &i );
    	switch( i ){
    	case 0:		/*	Addition	*/
    		id = fork();
    		if( (0) > id ){
    			perror("Echec fork\n");
    			exit( EXIT_FAILURE );
    		}
    		printf("(%s PID %d)%s\t:%d\n",(
    				((0) == id) ? "Fils": "Père"),
    				getpid(), "\tAddition", (x+y) );
    		break;
    	case 1:		/*	Multiplication	*/
    		id = fork();
    		if( (0) > id ){
    			perror("Echec fork\n");
    			exit( EXIT_FAILURE );
    		}
    		printf("(%s PID %d)%s\t:%d\n",(
    			((0) == id) ? "Fils": "Père"),
    			getpid(), "\tMultiplication", (x*y) );
    		break;
    	default:
    		printf("Commande inconnue\n");
    		break;
    	}
    	return( EXIT_SUCCESS );
    }
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. [DATA] [MERGE] Deux tables avec identifiants différents
    Par alers dans le forum SAS Base
    Réponses: 2
    Dernier message: 17/11/2013, 20h09
  2. [AC-2007] ajout de deux tables avec champs différents
    Par cedric pouilly dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/04/2013, 19h49
  3. Fusionner deux tables avec champs différents
    Par CyberMen dans le forum Débutez
    Réponses: 6
    Dernier message: 22/08/2012, 19h32
  4. Superposition de deux images avec codage différent
    Par cedji dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 15/02/2012, 16h12
  5. Lancer un processus avec fork
    Par snfever dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2010, 19h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo