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 :

programme fork, récupèrer la main sur le terminal [facile]


Sujet :

POSIX C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut programme fork, récupèrer la main sur le terminal [facile]
    Bonjour,

    Je réalise un mini projet en C sur un spooler d'impression...tout va bien pour l'instant.
    Le serveur tourne en fond (daemon), il lit les messages dans une queue (IPC).
    Et en même temps, j'aimerai bien consulter l'état de la queue, donc coté serveur j'aurai également l'intéraction avec l'utilisateur au clavier pour lire 2 commande
    par exemple: "liste" (pour afficher les impressions en attente) et "annule" pour annuler une impresssion

    Mais mon probleme est tout bête je pense...

    Donc, j'ai un programme gestimp-serveur.c qui écoute en boucle les messages dans la queue et les traite.

    Mais, j'aimerai bien qu'il puisse intéragir avec l'utilisateur, du coup, j'ai créais un seconde programme (invite_cmd.c"), qui écoute au clavier bétement (scanf) et qui réalise les traitement que je veux faire.

    la structure donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <--- code gestimp-serveur.c --->
    main()
    ...
    switch(pidFils = fork()){
        case -1: blabla erreur etc...break;
        case  0: /* (on est dans le fils) */
                    execl("invite_cmd.exe", NULL, NULL);
                    break;
        default: /* on est dans le pere */
                   // code du deamon --> écoute la file + traitement
    }
    Je lance mon appli ./gestimp-server.exe dans le terminal
    Il lance mon deamon, lorsqu'on envoie des messages dans la file (avec le client que j'ai pas détaillé ici), il les affiche sur le terminal.

    MAIS, le programme "invite_cmd" qui est censé lire les scanf au clavier...il a pas la main au terminal, du coup, je peux rien faire...

    Ma question: comment procéder pour que le serveur puisse afficher des messages sur le terminal, et que mon programme fils lui puisse EGALEMENT ET EN MEME TEMPS afficher et LIRE !

    Je sais pas trop comment procéder, j'ai fais des recherches sans résultat !
    Si vous pouviez aider une étudiante qui galère un peu...

    Cécilia, cordialement.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fantomasmusic Voir le message
    Bonjour,

    Je réalise un mini projet en C sur un spooler d'impression...tout va bien pour l'instant.
    Le serveur tourne en fond (daemon), il lit les messages dans une queue (IPC).
    Et en même temps, j'aimerai bien consulter l'état de la queue, donc coté serveur j'aurai également l'intéraction avec l'utilisateur au clavier pour lire 2 commande
    par exemple: "liste" (pour afficher les impressions en attente) et "annule" pour annuler une impresssion

    Mais mon probleme est tout bête je pense...

    Donc, j'ai un programme gestimp-serveur.c qui écoute en boucle les messages dans la queue et les traite.

    Mais, j'aimerai bien qu'il puisse intéragir avec l'utilisateur, du coup, j'ai créais un seconde programme (invite_cmd.c"), qui écoute au clavier bétement (scanf) et qui réalise les traitement que je veux faire.

    la structure donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <--- code gestimp-serveur.c --->
    main()
    ...
    switch(pidFils = fork()){
        case -1: blabla erreur etc...break;
        case  0: /* (on est dans le fils) */
                    execl("invite_cmd.exe", NULL, NULL);
                    break;
        default: /* on est dans le pere */
                   // code du deamon --> écoute la file + traitement
    }
    Je lance mon appli ./gestimp-server.exe dans le terminal
    Il lance mon deamon, lorsqu'on envoie des messages dans la file (avec le client que j'ai pas détaillé ici), il les affiche sur le terminal.

    MAIS, le programme "invite_cmd" qui est censé lire les scanf au clavier...il a pas la main au terminal, du coup, je peux rien faire...

    Ma question: comment procéder pour que le serveur puisse afficher des messages sur le terminal, et que mon programme fils lui puisse EGALEMENT ET EN MEME TEMPS afficher et LIRE !

    Je sais pas trop comment procéder, j'ai fais des recherches sans résultat !
    Si vous pouviez aider une étudiante qui galère un peu...

    Cécilia, cordialement.
    Ben inverse le père et le fils !!!
    Le fils gère la file et fait le traitement et le père prend ses infos au clavier et répond sur l'écran.

    Ou bien tu fais deux programmes séparés. p1 gère sa file et p2 interroge les IPCS et te répond. Et tu ne lances p2 que quand t'en as besoin...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    En inversant, j'obtient le meme probleme, lorsque je tappe une valeur, pas d'intéraction, pourtant le programme pere est celui qui attend au "scanf".

    Personne connait la maniere de faire cohabiter 2 programmes sous un seul terminal?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben un fprintf(stderr devrait afficher au même endroit (si le serveur est lancé en background. En daemon je ne sais pas).
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'ailleurs, au hasard (pas testé), pourquoi au lieu de fork ne pas faire un

    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
    int Est_Le_Fils = 0 ;
     
    int main ( int argc, char **argv )
    {
    char Chaine[30] ;
     
        if ( strcmp(argv[1], "-pere" )
          {
               sprintf ( Chaine, "%s -fils &", argv[0]);
               sytem(Chaine);
          }
        else
        if ( strcmp(argv[1], "-fils" )
         {
             Est_Le_Fils = 1 ;
         }
    .....
    }
    comme ça directement ils partagent le même contexte....

    [EDIT]
    d'ailleurs, dans ton cas, j'inverserais effectivement en ayant le père en background et le fils en foreground.
    [/EDIT]
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    Ce que tu appels en tache de fond?

    C'est en lancant le programme "./gestm-server.exe &"?

    Merci bien.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui...

    Et comme je disais j'inverserais :

    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
     
    int Est_Le_Fils = 1 ;
     
    int main ( int argc, char **argv )
    {
    char Chaine[30] ;
     
        if ( argc == 1 )
          {
               sprintf ( Chaine, "%s -pere &", argv[0]);
               sytem(Chaine);
          }
        else
        if ( strcmp(argv[1], "-pere" ) == 0 )
         {
             Est_Le_Fils = 0  ;
         }
        else
         {
             fprintf ( stderr, "Erreur d'argument !!!\n");
             return EXIT_FAILURE ;
         }
    .....
       if ( Est_Le_Fils )
          {
          }
       else
         {
         }
    ....
     
      return EXIT_SUCCESS ;
    }
    lancé par :

    "./gestm-server.exe"

    et là c'est le fils (donc saisie et affichage) qui est à la console et le père qui est en fond, et affiche ses messages via stderr, qui sort au même endroit...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Récupérer la main sur un process Runtime
    Par Mayhem555 dans le forum Général Java
    Réponses: 4
    Dernier message: 28/10/2011, 12h35
  2. reprendre la main sur un programme
    Par g.abdou dans le forum Administration système
    Réponses: 8
    Dernier message: 02/03/2011, 10h50
  3. Réponses: 3
    Dernier message: 21/02/2009, 19h44
  4. Reprendre la main sur le programme
    Par Darkthur dans le forum Débuter
    Réponses: 3
    Dernier message: 20/01/2009, 17h54
  5. [PowerBuilder] Récupérer la main sur une fenêtre modale
    Par jpdar dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 14h21

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