2008-10-20 7 views
3

je dois exécuter une commande CLI Linux et obtenir sa sortie stdout de C.obtenir une sortie de commande dans la conduite, C pour Linux

Je peux utiliser des tuyaux() pour créer un tuyau, puis fork/exec, redirection d'enfant stdout descriptor dans le canal avant d'appeler exec() et de lire le canal dans le parent. De plus, j'aurai besoin d'attendre l'enfant.

Existe-t-il un simple appel à fork + redirect + exec + wait, comme system() fork + exec + wait, seul system() ne fait pas la redirection.

Il ya popen(), qui fait fork + redirect + exec, mais ne fait pas d'attente, donc je ne peux pas obtenir le statut de sortie.

Répondre

6

Est-ce cela?

 
NAME 
     popen, pclose - process I/O 

SYNOPSIS 
     #include <stdio.h> 

     FILE *popen(const char *command, const char *type); 

     int pclose(FILE *stream); 

DESCRIPTION 
     The popen() function opens a process by creating a pipe, forking, 
and invoking the shell. Since a pipe is by definition unidirectional, the 
type argument may specify only reading or writing, not both; the resulting 
stream is correspondingly read-only or write-only. 

     The command argument is a pointer to a null-terminated string 
containing a shell command line. This command is passed to /bin/sh 
using the -c flag; interpretation, if any, is performed by the shell. 
The type argument is a pointer to a null-terminated string which must be 
either ‘r’ for reading or ‘w’ for writing. 

     The return value from popen() is a normal standard I/O stream in 
all respects save that it must be closed with pclose() rather than fclose(). 
Writing to such a stream writes to the standard input of the command; the 
command’s standard output is the same as that of the process that called 
popen(), unless this is altered by the command itself. Conversely, reading 
from a ‘‘popened’’ stream reads the command’s standard output, and the 
command’s standard input is the same as that of the process that called 
popen(). 

     Note that output popen() streams are fully buffered by default. 

     The pclose() function waits for the associated process to terminate 
and returns the exit status of the command as returned by wait4(). 
+0

besoin d'obtenir le statut de sortie de la commande –

+1

pclose fournit la même valeur que wait4(), donc vous y êtes bien ... – dmckee

+2

pclose() le retourne avec un avertissement: l'échec de l'exécution du shell est indiscernable de l'échec du shell à s'exécuter commande, ou une sortie immédiate de la commande. Le seul indice est un statut de sortie de 127. Donc, si cela ne suffit pas, vous devez écrire votre propre, comme dmckee dit –

1

Utilisez popen() et pclose().


popen() n'attend pas vraiment, bien sûr, mais lit sur le tuyau bloquera jusqu'à ce qu'il y a des données disponibles.

pclose() attend, mais l'appeler prématurément pourrait couper certaines sorties du processus en fourche. Vous aurez envie de déterminer à partir du flux lorsque l'enfant se fait ...


Peut-être déjà discuté à How can I run an external program from C and parse its output?

+0

pclose() attend bien –

+0

Oui. Lisez à nouveau la page de manuel. Merci. – dmckee

1

Voici ce que j'utiliser:

/* simply invoke a app, pipe output*/ 
    pipe = popen(buf, "r"); 
    if (pipe == NULL) { 
     printf("invoking %s failed: %s\n", buf, strerror(errno)); 
     return 1; 
    } 

    waitfor(10); 

    while(!feof(pipe)) { 
     if(fgets(buf, 128, pipe) != NULL) { 
      printf("%s\n", buf); 
     } 
    } 

    /* Close pipe */ 
    rc = pclose(pipe); 
3

GLib a une fonction bien pour cela - g_spawn_sync(): http://library.gnome.org/devel/glib/stable/glib-Spawning-Processes.html#g-spawn-sync

Par exemple, pour exécuter une commande et obtenir son statut de sortie et sortie:

const char *argv[] = { "your_command", NULL }; 
char *output = NULL; // will contain command output 
GError *error = NULL; 
int exit_status = 0; 
if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, 
        &output, NULL, &exit_status, &error)) 
{ 
    // handle error here 
} 
Questions connexes