Domanda

testo Il comando $ avrdude -c usbtiny shell uscite stderr. Non riesco a leggere con Commmands quali head-meno-più cos non è stdout. Voglio il testo allo stdout o in un file. Come posso farlo in C? Ho cercato di risolvere il problema da la mia ultima domanda ma ancora irrisolto.

È stato utile?

Soluzione

Non ho provato qualcosa di simile in OpenBSD, ma in almeno un paio di * nix-like sistemi, è possibile farlo utilizzando dup2.

#include <unistd.h>
#include <stdio.h>

int main(void) {  

  fprintf(stderr, "This goes to stderr\n");

  dup2(1, 2);  //redirects stderr to stdout below this line.

  fprintf(stderr, "This goes to stdout\n");
}

Altri suggerimenti

Il modo più normale sarebbe qualcosa come:

avrdude -c usbtiny 2>&1

Questa dirige quello che normalmente andare a stderr per andare a stdout invece. Se preferisci a dirigere in un file, si potrebbe fare qualcosa di simile:

avrdude -c usbtiny 2> outputfile.txt

Di seguito utilizza la funzione POSIX per duplicare il numero di file standard output nel numero di file standard error. Duplicazione stderr su stdout è dato nella pagina POSIX per dup2 come esempio di utilizzo della funzione.

#include <unistd.h>
#include <stdio.h>

int main (void)
{
    pid_t child = fork();

    if (child == 0)
    {
        dup2(STDOUT_FILENO, STDERR_FILENO);
        execlp("avrdude", "-c", "usbtiny", NULL);
    }
    else if (child > 0)
    {
        waitpid(child);
        puts("Done!");
    }
    else
    {
        puts("Error in forking :(");
    }

    return 0;
}
  

Ho bisogno di bloccare in qualche modo il comando in C così posso ottenere il suo stderr

Inizia con la lettura man fork, man exec su come avviare un processo figlio. Se vuoi in man 7 signal, man sigaction e man wait per come raccogliere il bambino.

Infine, il man dup2.

codice non testato per esemplificare:

int pip_stderr[2];
int r;
int pid;

r = pipe(pip_stderr);
assert( r != -1 );

int pid = fork();
assert( pid != -1 );
if (pid == 0) { /* child */
   /* child doesn't need to read from stderr */
   r = close(pip_stderr[0]); assert( r != -1 );
   /* make fd 2 to be the writing end of the pipe */
   r = dup2(pip_stderr[1], 2); assert( r != -1 );
   /* close the now redundant writing end of the pipe */
   r = close(pip_stderr[1]); assert( r != -1 );
   /* fire! */
   exec( /* whatever */ );
   assert( !"exec failed!" );
} else { /* parent */
   /* must: close writing end of the pipe */
   r = close( pip_stderr[1] ); assert( r != -1 );

   /* here read from the pip_stderr[0] */

   r = waitpid(pid,0,0); assert( r == pid );
}

Uso dup2 () sostituiamo stderr (che è fd 2) del bambino con un finale di scrittura di un tubo. pipe () viene richiamato prima forcella (). Dopo forcella abbiamo anche chiudere tutti attaccatura estremità del tubo in modo che la lettura nel processo genitore possa effettivamente ricevere EOF.

Probabilmente c'è una soluzione più semplice utilizzando stdio, ma io non sono a conoscenza di esso. Dal momento che popen () esegue il comando attraverso la shell, probabilmente si può dire che per reindirizzare stderr su stdout (e inviare stdout a / dev / null). Mai provato.

Si può anche utilizzare mktemp () (man 3 mktemp) per creare un nome di file temporaneo, il comando di composizione per il sistema () per reindirizzare stderr del comando per il file temporaneo e dopo il sistema () restituisce leggere il file temporaneo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top