2009-03-18 6 views

Répondre

7

Est-ce que popen fonctionnerait? Il engendre le processus, puis vous lisez/écrivez avec FILE* handle

5

Ensuite, votre choix est system(), ou d'utiliser une bibliothèque qui encapsule le processus de génération pour vous. Ce dernier, ou le moyen le plus difficile que vous souhaitiez éviter, est recommandé si vous souhaitez un contrôle précis des erreurs, des tuyaux, etc.

3

système() est assez facile.

Mais vous devriez essayer de ne pas le faire si vous le pouvez. Les scripts fonctionnent mieux quand ils sont au top des choses, pas en dessous. Si vous êtes sous UNIX, il est souvent préférable de décomposer le travail et d'écrire un script de haut niveau pour appeler toutes les pièces. Je me souviens d'avoir vu un programmeur ajouter un grand nombre d'appels système dans son code C afin d'éviter d'avoir à apprendre le shell Bourne. Il a pensé que c'était une manière intelligente et rapide de le faire fonctionner, mais quand il a échoué, il a échoué gravement. Il a gaspillé énormément de temps à déboguer le désordre. Il aurait été beaucoup plus rapide d'apprendre quelques commandes simples de shell ...

Paul.

1

libc a des fonctions system et popen, qui fonctionnent un peu comme ceci:

int system(cont char *command) { 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    int status; 
    pid_t child = fork(); 
    if (child == 0) { 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    waitpid(child, &status, 0); 
    return status; 
} 

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

(sauf avec plus de vérification des erreurs et des choses)

Si vous souhaitez un contrôle plus précis sur la manipulation argument (au lieu de passer par sh), ou vous voulez contrôler plus d'un des {stdin, stdout, stderr}, vous devrez l'écrire vous-même ou trouver une bibliothèque. Mais la bibliothèque standard couvre la plupart des cas d'utilisation.

1

Vous pouvez le faire via l'appel système() Ce Thread est un bon exemple