Communiquer entre des processus fils.
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Communiquer entre des processus fils.



  1. #1
    invite14252976

    Communiquer entre des processus fils.


    ------

    Bonjour,

    Je suis actuellement en train d'apprendre les signaux sur Linux. Pour celà, je m'entraîne sur un exercice, qui me demande de faire une recherche dans un tableau d'entier. Cette recherche est faites par deux processus fils qui doivent se diviser la tâche en deux (un qui recherche dans la première moitié du tableau et l'autre dans la deuxième partie.). J'ai fait cette partie !

    Maintenant, on me demande d'interompre l'autre processus fils que l'entier est trouvé en utilisant les signaux.

    Voici ce que j'ai fait précédement :
    Code:
    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <time.h>
    #include "gestion.h"
    
    void Recherche_Tab(int tab[],int taille, int x);
    bool IsEven(int x);
    
    int main(int argc, char *argv[]){
        
        pid_t pid_fils1 = -1;
        pid_t pid_fils2 = -1;
        int N, i, x;
        int *tab;
    
        // Appliquer les signaux au gestionnaire
        AddSignal(); 
        
        // Demander la taille du tableau
        printf("Quelle est la taille du tableau ? ");
        scanf("%d",&N);
        
        tab = (int *)malloc(N*sizeof(int));
    
        // Demander les valeurs du tableau
        printf("Entrez les valeurs dans votre tableau : ");
        for(i=0;i<N;i++){
            scanf("%d",&tab[i]);
        }
        
        // Demander la valeur à chercher
        printf("Quel entier voulez-vous chercher ? ");
        scanf("%d",&x);
    
        // Création de deux processus fils
        pid_fils1 = fork();
        pid_fils2 = fork();
    
    
        if(pid_fils1 == 0){
            
            // Rechercher dans le tableau jusqu'à la moitié
            Recherche_Tab(tab,N/2,x);
            sleep(10);
            exit(EXIT_SUCCESS);
        }
    
        if(pid_fils2 == 0){
    
            // Si la taille du tableau est paire
            if(IsEven(N)){
                Recherche_Tab(&tab[N/2],N/2,x);
            }
    
            else{
                Recherche_Tab(&tab[N/2],(N/2)+1,x);
            }
            sleep(10);
            exit(EXIT_SUCCESS);
        }
    
        return EXIT_SUCCESS;
    }
    
    /**********************************************************
     *  Recherche_Tab()
     * 
     *  role : rechercher une valeur dans un tableau
     *  intput :    tab : tableau d'entier
     *              taille : taille du tableau
     *              x : entier recherché
     *********************************************************/
    void Recherche_Tab(int tab[],int taille, int x){
    
        int i;
    
        for(i=0;i<taille;i++){
            if(tab[i] == x){
                printf("Trouve par %d!!\n",getpid());
            }
        }
    }
    
    /**********************************************************
     *  IsEven()
     * 
     *  role : permet de savoir si un entier est pair
     *  intput :    x : entier
     *  output :    false : l'entier est impair
     *              true : l'entier est pair
     *********************************************************/
    bool IsEven(int x){
        return (x%2) == 0;
    }
    Merci d'avance !
    Dylan

    -----

  2. #2
    polo974

    Re : Communiquer entre des processus fils.

    trop de fork() ...
    explications:
    Code:
    // un process P0
         // Création de deux processus fils     
         pid_fils1 = fork();
         printf("pid_fils1 %d\n", pid_fils1);
    // 2 process P0 F1
         pid_fils2 = fork(); // il faudrait au moins tester pid_fils1 pour savoir si c'est le père ou le fils1
         printf("pid_fils1 %d pid_fils2 %d\n", pid_fils1, pid_fils2);
         return 0;
    // 4 process P0 F0_2 F1 F1_2
    oups...
    4 process qui tournent...
    (j'ai ajouté des printf pour bien démontrer (et un return 0 pour sortir))

    pour avoir 2 process, il suffit d'avoir le père et un fils, donc un seul fork (be oui, le papa, il peut aussi bosser...).

    Code:
    papa = getpid();
    pid_fils1 = fork();
    
    if (pid_fils1) { // papa
       faire le job puis tuer pid_fils1; 
    }
    else { // fiston
       faire l'autre job puis tuer papa; 
    }
    sauf que attention... il faut que les job soient assez courts pour ne pas risquer de boucler les pid... (normalement ça passe, mais bon, c'est un risque)

    man 2 getpid
    man 2 fork
    man 2 kill
    Jusqu'ici tout va bien...

  3. #3
    invite14252976

    Re : Communiquer entre des processus fils.

    Oui merci, je vois bien l'idée mais le sujet nous demande bien de créer deux fils ou chacun va travailler. Le père ici ne doit pas rechercher !

    Est-ce-que tu vois ce que je veux dire ?

    Dylan

Discussions similaires

  1. VBA communiquer entre les fichiers
    Par invitec078c399 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 18/04/2016, 09h39
  2. [RF/Radioelec] Faire communiquer 2 Arduino en hf et ou avec 2 fils
    Par invite6ddf9b74 dans le forum Électronique
    Réponses: 20
    Dernier message: 11/02/2016, 20h30
  3. Différence entre les inductances 2 fils et 4 fils
    Par AmigaOS dans le forum Électronique
    Réponses: 22
    Dernier message: 11/12/2014, 08h05