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 :

Problème entrée standard sur un programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut Problème entrée standard sur un programme
    Bonjour à tous,

    Ne sachant pas trop où poster ça, je l'ai mis dans débuter en C (je me trompe peut-être). Venant du Java, j'ai assez peu l'habitude de programmer en C et je découvre plein de subtilités J'ai cherché sur le forum une réponse mais je n'ai rien trouvé (je manque sans doute de vocabulaire pour une recherche plus "fine")

    Le contexte : on m'a demandé de programmer une sorte de cron en C (un peu plus intelligent car il sera capable de traiter les réponses et de réagir en conséquence...). J'ai fini mes specs, mon plan développement et mon plan qualité et je commence à coder. Je suis sous un environnement linux / ubuntu. Le code n'est pas destiné à être porté sous windows.

    Mon souci : je n'arrive pas à envoyer sur l'entrée standard de mon programme un ordre. Soit je le relance, soit il ne le prends pas en compte. Si je suis dans le même terminal, je n'ai aucun souci, il me prends bien en compte ce que je tape au clavier, par contre, je n'arrive pas à lui envoyer une chaîne de caractère via un autre terminal (peut-être dois-je récupérer le PID ?), je ne sais même pas si c'est un problème en C ou un problème sous Linux. La plupart des exemples que j'ai trouvé ne tiennent pas en compte que le programme est déjà lancé et tourne en boucle...

    Ma question est donc la suivante : comment faire pour envoyer une chaîne de caractère sur l'entrée standard de mon programme via une commande (sh ou C ?) quand celui-ci est lancé et est en écoute sur son entrée ?

    Je vous joins mon code source trouvé en exemple :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pthread.h>
    #include <signal.h>
    #define STDIN 0  // file descriptor for standard input
     
    /************************************************************************/
    /*                                                                      */
    /*                      Programme principal                             */
    /*                                                                      */
    /************************************************************************/
     
     
    int main(void)
    {
    	struct timeval tv;
    	fd_set readfds;
     
    	tv.tv_sec = 200;
    	tv.tv_usec = 500000;
     
    	FD_ZERO(&readfds);
    	FD_SET(STDIN, &readfds);
     
    	// don't care about writefds and exceptfds:
    	select(STDIN+1, &readfds, NULL, NULL, &tv);
     
    	if (FD_ISSET(STDIN, &readfds))
    		printf("A key was pressed!\n");
    	else
    		printf("Timed out.\n");
     
    	return 0;
    }
    Merci d'avance

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Sharpounet Voir le message
    Si je suis dans le même terminal, je n'ai aucun souci, il me prends bien en compte ce que je tape au clavier, par contre, je n'arrive pas à lui envoyer une chaîne de caractère via un autre terminal
    Oui c'est logique, un programme à un ou zéro pseudo terminaux relié à son entrée standard.

    Citation Envoyé par Sharpounet Voir le message
    je ne sais même pas si c'est un problème en C ou un problème sous Linux.
    C'est un problème de conception.

    Citation Envoyé par Sharpounet Voir le message
    La plupart des exemples que j'ai trouvé ne tiennent pas en compte que le programme est déjà lancé et tourne en boucle...
    Ton programme est donc daemon, généralement, un daemon communique via une socket.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    Hop,

    Tout d'abord merci d'avoir répondu si vite
    Suite à ton message et à quelques recherches, je saisis un peu plus le fonctionnement que devra prendre mon Daemon.

    J'ai trouvé une solution qui consiste à créer un process fils à l'exécution, qui lira en permanance un .fifo, ça m'a l'air pas mal comme solution, j'envoie mes données via ce flux nommé et le fils les lit et agit en conséquence. Est-ce que c'est viable ? Pour les sockets, je suis sur le même poste mais je peux boucler sur un port en local non ?

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Sharpounet Voir le message
    J'ai trouvé une solution qui consiste à créer un process fils à l'exécution, qui lira en permanance un .fifo, ça m'a l'air pas mal comme solution, j'envoie mes données via ce flux nommé et le fils les lit et agit en conséquence. Est-ce que c'est viable ? Pour les sockets, je suis sur le même poste mais je peux boucler sur un port en local non ?
    Une fifo est un bon moyen de communication en effet, autrement pour les sockets en local, tu as les sockets "locales" justement (AF_LOCAL), autrefois appelé socket UNIX (AF_UNIX).

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    Ah génial, exactement ce qu'il me fallait.
    Merci beaucoup, je passe en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Problémes entre base sur W7 et W8
    Par le méruvien dans le forum Access
    Réponses: 4
    Dernier message: 23/10/2014, 06h20
  2. Réponses: 5
    Dernier message: 23/10/2009, 18h42
  3. Problème de résultat sur un programme en Pascal
    Par Poseidon62 dans le forum Langage
    Réponses: 1
    Dernier message: 28/03/2009, 20h13
  4. Problème de pile sur un programme.
    Par Dam63 dans le forum C
    Réponses: 11
    Dernier message: 29/10/2007, 13h46
  5. Problème de lien sur date entre Access et MySQL-4.1
    Par michou42 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 04/04/2005, 23h31

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