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

C Discussion :

processus qui appel une fonction


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut processus qui appel une fonction
    Bonsoir j'ai 3 fonctions :

    La première doit changer l'état d'une variable passé en paramètre de la fonction que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static int LED[3] = {0,0,0}
     
    void eclair(int e){
    LED[1] = e;
    printf("maintenant la LED n°1 est à %d", e);
    }
    et ma deuxième fonction crée un processus fork prenant en paramètre une fonction contenant les différentes actions à réalisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int nouveau_programme( void (*nouv_prog)() ){
    pid_t processus;
    processus = fork();
     
    if (processus = -1){ 
    return -1;
    }
    else if (processus == 0){
    printf("je suis dans le processus fils");
    return EXIT_SUCCESS;
    }
    }
    et donc par exemple si je veux que l'utilisateur utilise void eclair(int e) dans un nouveau processus, il fera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void mon_prog1() {
    void eclair(1);
    }
     
    nouveau_programme( mon_prog1());
    Le problème est que lorsque j’exécute ce programme, je passe bien par le processus fils crée car j'ai le message : je suis dans le processus fils
    Mais l'état de ma variable : LED[1] est toujours à 0 !
    je ne comprend pas !

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    oups pardon j'ai posté trop vite sur le forum j'ai finalement réalisé que j'avais oublié ceci dans mon fork() :
    logique la fonctionne n'était pas appelé lors de la création du fils !
    merci quand même.

    bonne nuit.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Dans ce cas là tu doit utiliser un thread (pthread.h) et non un fork().

    Un fork() va copier tout l'espace mémoire du processus père.
    Le fils se retrouve donc avec une copie des variables du père, les pointeurs pointant aussi sur des copies. Donc si tu modifie une variable dans le processus fils, tu ne modifieras qu'une copie.

    Le thread en revanche va te permettre d'avoir le même espace mémoire pour le processus père et le processus fils.

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Un fork() va copier tout l'espace mémoire du processus père.
    Le fils se retrouve donc avec une copie des variables du père, les pointeurs pointant aussi sur des copies. Donc si tu modifie une variable dans le processus fils, tu ne modifieras qu'une copie.

    Le thread en revanche va te permettre d'avoir le même espace mémoire pour le processus père et le processus fils.
    C'est effectivement l'une des différences entre un processus "leger" utilisant pthread et un processus "lourd" utilisant fork.

    Cependant si l'utilisation de fork est une contrainte imposée (exercice de tp par exemple) tu peux quand même partager de la mémoire et des informations entre les processus en utilisant un segment de mémoire partagée, un pipe (nommé ou anonyme) un sémaphore, un signal,....

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Oui effectivement les thread serait plus adapté mais je souhaite me casser la tête avec le fork, et en particulier les ipc pour me familiariser, car je suis convaincu que c'est en pratiquant que l'on apprend.

    ainsi dans le même optique que mon programme précédent je souhaite maintenant lancé un deuxième programme qui récupère l'état de la LED la fonction état LED serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Etat_eclair(){
    return LED[1];
    }
    ainsi pour lancer cette fonction en parralléle je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void mon_prog2() {
    int Etat_eclair();
    }
     
    nouveau_programme( mon_prog2());
    ainsi pour récupérer la valeur de la LED, je dois faire communiquer mon_prog1() et mon_prog2() j'ai donc pensé au Message queue MSQ, mais si je n'utilise pas d'IPC je peux très bien afficher ma variable en appelant simplement ma fonction car après tous la variable est déclaré dans le main() qu'on pensez vous ?

Discussions similaires

  1. Point cliquable qui appelle une fonction javascript
    Par oncle sam dans le forum SIG : Système d'information Géographique
    Réponses: 5
    Dernier message: 19/05/2011, 01h01
  2. requête qui appelle une fonction
    Par da_latifa dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/02/2010, 21h47
  3. Lien <a href .. qui appelle une fonction php
    Par CristinaB dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2008, 16h03
  4. Récupérer le nom du fichier qui appelle une fonction
    Par DeezerD dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 14h37
  5. Connaitre le processus qui appelle une fonction API
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 28/05/2006, 13h56

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