10
votes

C: Comment rediriger STDERR à partir de la commande system-commander au stdout ou au fichier?

La commande shell $ AVRDUDE -C USBTTINY sortira du texte sur starr. Je ne peux pas la lire avec des commmands tels que la tête - plus COS, ce n'est pas stdout. Je souhaite le texte à STDOUT ou à un fichier. Comment puis-je le faire en C? J'ai essayé de résoudre le problème par ma dernière question mais toujours non résolue.


0 commentaires

4 Réponses :


3
votes

La voie normale serait quelque chose comme: XXX

Ceci dirige ce qui allait normalement aller à stardr pour aller à STDOUT à la place. Si vous préférez vous diriger vers un fichier, vous pouvez faire quelque chose comme: xxx


2 commentaires

@ user355926: sur quelle plate-forme? La norme ne couvre pas cela, vous aurez donc besoin d'un code non portable pour le faire dans C.


J'ai besoin de bloquer la commande en c afin que je puisse obtenir son starr



21
votes

Je n'ai pas essayé quelque chose comme celui-ci dans OpenBSD, mais dans au moins quelques systèmes de type * Nix, vous pouvez le faire en utilisant DUP2 code>.

#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");
}


1 commentaires

Il y a deux autres réponses similaires, mais pour une raison quelconque, ils semblent penser que vous devez avoir besoin de fourchette afin d'utiliser DUP2.



0
votes

Les éléments suivants utilisent la fonction POSIX pour dupliquer le numéro de fichier de sortie standard dans le numéro de fichier d'erreur standard. Dupliquant STDRER à STDOUT est donné dans la page POSIX de DUP2 code > comme exemple d'utilisation de la fonction.

#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;
}


0 commentaires

0
votes

J'ai besoin de bloquer en quelque sorte la commande en c afin que je puisse obtenir son starr

Commencez par la lecture Man Fork , Man EXEC Comment démarrer un processus d'enfant. Regarder dans man 7 signal , homme sigaction et homme attendre pour comment récolter l'enfant.

Enfin, le < code> homme DUP2 .

code non testé pour illustrer: xxx

à l'aide de DUP2 () Nous remplaçons STDRR (qui est FD 2) de l'enfant avec une extrémité d'écriture d'un tuyau. Le tuyau () est appelé avant la fourchette (). Après la fourche, nous devons également fermer tous les extrémités suspendus de la tuyau de sorte que la lecture dans le processus parent reçoive réellement EOF.

probablement il y a une solution plus simple en utilisant stdio, mais je Je ne suis pas au courant de cela. Puisque popen () exécute la commande via Shell, on peut probablement le dire de rediriger STDRER à STDOUT (et d'envoyer STDOUT TO / DEV / NULL). Jamais essayé ça.

On peut aussi utiliser mktemp () ( man 3 mktemp ) pour créer un nom de fichier temporaire, composez la commande de système () pour rediriger stardr de la commande à Le fichier Temp et après System () renvoie lire le fichier Temp.


0 commentaires