2010-11-08 6 views
1

Je dois créer un programme qui exécute un processus (mon autre programme) et peut communiquer avec ce processus (envoi de stdin et réception de stdout). J'ai lu sur les fonctions comme popen() et CreateProcess() mais je ne comprends pas vraiment comment travailler avec eux.Linux C++ s'exécute et communique avec le nouveau processus

Serait bien, si vous me montrer un exemple de code (comment démarrer le processus, envoyer stdin, recevoir stdout). Les fonctions C++ seraient préférées (s'il y en a).

Merci dans le conseil.

Répondre

5

L'interface pour POSIX fonctionne uniquement en langage C. Mais vous pouvez les utiliser en C++.

En gros:

#include <unistd.h> 
// Include some other things I forgot. See manpages. 

int main() 
{ 
    // Open two pipes for communication 
    // The descriptors will be available to both 
    // parent and child. 
    int in_fd[2]; 
    int out_fd[2]; 

    pipe(in_fd); // For child's stdin 
    pipe(out_fd); // For child's stdout 

    // Fork 
    pid_t pid = fork(); 

    if (pid == 0) 
    { 
     // We're in the child 
     close(out_fd[0]); 
     dup2(out_fd[1], STDOUT_FILENO); 
     close(out_fd[1]); 

     close(in_fd[1]); 
     dup2(in_fd[0], STDIN_FILENO); 
     close(in_fd[0]); 

     // Now, launch your child whichever way you want 
     // see eg. man 2 exec for this. 

     _exit(0); // If you must exit manually, use _exit, not exit. 
        // If you use exec, I think you don't have to. Check manpages. 
    } 

    else if (pid == -1) 
     ; // Handle the error with fork 

    else 
    { 
     // You're in the parent 
     close(out_fd[1]); 
     close(in_fd[0]); 

     // Now you can read child's stdout with out_fd[0] 
     // and write to its stdin with in_fd[1]. 
     // See man 2 read and man 2 write. 

     // ... 

     // Wait for the child to terminate (or it becomes a zombie) 
     int status 
     waitpid(pid, &status, 0); 

     // see man waitpid for what to do with status 
    } 
} 

Ne pas oublier de vérifier les codes d'erreur (que je ne l'ai pas), et consultez les pages de manuel pour les détails. Mais vous voyez le point: lorsque vous ouvrez des descripteurs de fichiers (par exemple via pipe), ils seront disponibles pour les parents et les enfants. Le parent ferme une extrémité, l'enfant ferme une autre extrémité (et redirige la première extrémité). Etre intelligent et ne pas avoir peur des pages de google et de man.

Questions connexes