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 :

Savoir quand un code s'exécute


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut Savoir quand un code s'exécute
    Bonjour à tous.

    Voici le contexte :

    J'ai à ma disposition des librairies spécialement développées pour utiliser un mini pc doté de nombreuses interfaces de communication tournant sous linux.

    Je voudrais développer une sorte d'interface commande AT sur console qui permette d'une part d'appeler les exécutables classiques linux (dans /bin et /sbin) tels que ifconfig, echo, etc, et d'autre part des exécutables liés aux fonctions disponibles dans les librairies fournies.

    Voici une version très simplifiée du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(1)
    {
       Affichage("Saisissez une commande")
       Récupération de la commande et des arguments s'il y en a
       Appel avec la fonction system()
    }
    Voici maintenant mon problème :

    Les exécutables liés aux librairies appellent des fonctions de ces librairies qui elles même font des appels d'exécutables avec system().
    Dans mon code, quand je fais mon appel system(), je récupère la main dès que le premier exécutable est lancé et mon code poursuit la séquence du while() et redemande une une nouvelle commande. L'ennui c'est que l'exécutable appelé par la librairie est toujours en train de tourné et fait des outputs sur la sortie standard après que mon code ait demandé de saisir une nouvelle commande...

    j'aimerai donc savoir comment je pourrais faire pour savoir que les exécutables appelés par les librairies sont toujours en cours d'exécution, sans toucher aux codes des librairies?
    Ainsi je pourrai modifier mon code pour qu'il attende la fin de leur exécution avant de poursuivre dans le while() et demander la saisie d'une autre commande.


    J'espère que l'explication de mon problème est compréhensible... N'hésitez pas à me demander des précisions.

    Et surtout merci beaucoup d'avance à ceux qui me répondront!

  2. #2
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour,

    sous Linux si tu execute une commande avec un & à la fin tu peux la retouver
    par la commande jobs

    voici un exemple avec la commande sleep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vincent@vincent-laptop:~$ sleep 2 &
    [1] 4994
    vincent@vincent-laptop:~$ jobs
    [1]+  Running                 sleep 2 &
    vincent@vincent-laptop:~$ jobs
    [1]+  Done                    sleep 2
    vincent@vincent-laptop:~$ jobs
    vincent@vincent-laptop:~$
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    Bonjour,

    sous Linux si tu execute une commande avec un & à la fin tu peux la retouver
    par la commande jobs

    voici un exemple avec la commande sleep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vincent@vincent-laptop:~$ sleep 2 &
    [1] 4994
    vincent@vincent-laptop:~$ jobs
    [1]+  Running                 sleep 2 &
    vincent@vincent-laptop:~$ jobs
    [1]+  Done                    sleep 2
    vincent@vincent-laptop:~$ jobs
    vincent@vincent-laptop:~$
    Merci pour cette réponse, Je ne connaissais pas cette commande.
    Malheureusement ça ne m'aide pas à résoudre mon problème, j'ai besoin d'une méthode que je peux coder en C.

  4. #4
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,
    Citation Envoyé par Ayor9 Voir le message
    j'aimerai donc savoir comment je pourrais faire pour savoir que les exécutables appelés par les librairies sont toujours en cours d'exécution, sans toucher aux codes des librairies?
    Ainsi je pourrai modifier mon code pour qu'il attende la fin de leur exécution avant de poursuivre dans le while() et demander la saisie d'une autre commande.
    Un moyen est d'utiliser fork() / exec() / waitpid(). Mais je comprends pas trop ton probleme, un appel a system() est bloquant normalment (c'est a dire qu'il bloque le programme appellant tant que la commande n'a pas fini de s'executer).

    Et plus generalement, pourquoi ne pas utiliser telnet ou un equivalent?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Citation Envoyé par tonton fred Voir le message
    Salut,

    Un moyen est d'utiliser fork() / exec() / waitpid(). Mais je comprends pas trop ton probleme, un appel a system() est bloquant normalment (c'est a dire qu'il bloque le programme appellant tant que la commande n'a pas fini de s'executer).

    Et plus generalement, pourquoi ne pas utiliser telnet ou un equivalent?
    L'appel de system() se fait sur un script. La fonction system() se termine après avoir lancer le script et non après qu'il se soit exécuté.

    Je ne comprends pas le lien avec telnet, peux-tu me donner plus de détails stp?

  6. #6
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Citation Envoyé par Ayor9 Voir le message
    L'appel de system() se fait sur un script. La fonction system() se termine après avoir lancer le script et non après qu'il se soit exécuté.
    Bizarre. Peut etre est ce le script qui est en cause? Peux tu essayer d'executer un programme et verifier si l'appel a system() bloque?

    Citation Envoyé par Ayor9 Voir le message
    Je ne comprends pas le lien avec telnet, peux-tu me donner plus de détails stp?
    Moi non plus En relisant ton premier message j'ai compris que tu voulais controler les interfaces en local, pas le mini-pc a distance via les interfaces comme je l'avais compris au depart...

Discussions similaires

  1. Savoir quand ma tâche d'impression est finie sur impr réseau
    Par khany dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 21/02/2005, 09h13
  2. [JTextField]Savoir quand le contenu à changer
    Par Antunes dans le forum Composants
    Réponses: 4
    Dernier message: 25/08/2004, 14h43
  3. Savoir quand une hotkey est relachée
    Par kriterium dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2004, 14h44
  4. [JScrollPane]Comment savoir quand une scrollbar apparait ?
    Par FrigoAcide dans le forum Composants
    Réponses: 4
    Dernier message: 29/04/2004, 10h10
  5. [FORM] -> Savoir quand l'utilisateur la réduit ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2003, 00h10

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