2010-02-13 10 views
2

J'ai ce programme C++ qui effectue un ping simple sur une adresse IP spécifiée. Je ne suis pas en réseau donc j'utilise simplement la commande system() en C++ pour exécuter le ping depuis un shell et stocker les résultats dans un fichier, c'est facile. Le problème est que je veux que certains points soient imprimés sur l'écran pendant que la commande system() est exécutée. j'ai essayé avec:Effectuer d'autres tâches pendant l'exécution d'une commande system()

while(system(cmd)) 
{ 
//execute the task here 
} 

mais pas de succès. Je pense que je devrais créer des fils ou quelque chose.

Pouvez-vous m'aider? Qu'est-ce que je suis censé faire exactement pour faire ce que je veux?

+5

DANGER. Belle syntaxe mais malheureusement ça ne marche pas comme ça. while() va exécuter system (cmd) de nouveau * sur * * chaque * * boucle *! – Paul

+0

Je viens de le réaliser .. Eh bien c'était juste mon idée après tout. Je suis à la recherche d'un moyen pendant que le système (cmd) est en cours d'exécution pour être en mesure de faire d'autres choses. – ggg

+1

Pouvez-vous préciser de quel OS parlez-vous? – t0mm13b

Répondre

5

Vous devez créer un processus forké en utilisant fork, comme ceci, et en utilisant popen pour lire l'entrée de la sortie de la commande ping google.com et la traiter en conséquence. Beej comprend un intéressant guide sur la compréhension des mécanismes IPC qui est inclus dans l'exemple de code ci-dessous ...

 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(void) 
{ 
    pid_t pid; 
    int rv; 
    FILE *ping; 
    char buf[2000]; 
    switch(pid = fork()) { 
    case -1: 
     perror("fork"); /* something went wrong */ 
     exit(1);   /* parent exits */ 

    case 0: 
     // We're the child 
     ping = popen("ping google.com", "r"); 
     if (ping != NULL){ 
      fgets(buf, sizeof(buf), ping); 
      pclose(ping); 
      rv = 0; 
     }else{ 
      perror("popen failed"); 
      rv = -1; 
     } 
     exit(rv); 
    default: 
     // We're the parent... 
     wait(&rv); 
    } 
    // Now process the buffer 
    return 0; 
} 

Hope this helps, Meilleures salutations, Tom.

8

Le problème avec system est qu'il suspend l'exécution jusqu'à la fin. Sur les systèmes Unix, vous devrez utiliser une séquence de fork, execv, dup2 et pipe. Cela vous permettra de faire quelque chose de plus utile. Voir http://docs.linux.cz/programming/c/unix_examples/execill.html pour un exemple.

+2

Commentaire redacted: Vous pouvez enregistrer des problèmes sur le combo 'fork',' exec', 'pipe' en utilisant' popen' si vous êtes satisfait de la communication unidirectionnelle. – dmckee

1

Si vous êtes sur un système unix, vous pouvez lancer une commande avec un & pour indiquer qu'il fonctionne en arrière-plan comme celui-ci: MyScript &

Cela va démarrer un nouveau processus distinct du programme en cours. Vous devez prendre le numéro de processus (espérons que du système, ma connaissance de posix api est rouillée) et ensuite vérifier probablement avec un appel à quelque chose comme wait ou waitpid avec non-bloquant allumé.

Ceci est compliqué pour un débutant - je laisserai quelqu'un d'autre afficher des détails si toujours intéressé.

2

Modifier En considération, je crois que popen est la voie à suivre avec ou sans sortie de cmd.


ancien

Vous cherchez probablement pour quelque chose dans la famille wait (2) des commandes plus une fourchette et exec.

A partir de la page de manuel

La fonction d'attente() suspend l'exécution de son processus d'appel jusqu'à ce que l'information stat_loc est disponible pour un processus enfant mis fin, ou un signal est reçu. Au retour d'un appel wait() réussi, la zone stat_loc contient des informations de terminaison sur le processus que a quitté comme défini ci-dessous.

Ou si cmd certains retours d'information de progrès que vous voulez popen (3) dont il est question dans un certain nombre de questions existantes SO; par exemple How can I run an external program from C and parse its output?.

+0

Pour lui, cela peut vouloir dire qu'il ne veut pas appeler wait(), car il va bloquer jusqu'à ce que le processus fils finisse, ce qu'il veut éviter. Cependant, je me souviens d'une option ou d'un paramètre non bloquant. Bonne réponse, de toute façon. – Paul