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é
    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 chevronné
    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é
    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 chevronné
    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é
    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 chevronné
    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