La commande shell $ AVRDUDE -C USBTTINY code> 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. p>
4 Réponses :
La voie normale serait quelque chose comme: 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: p>
@ 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
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");
}
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.
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; }
J'ai besoin de bloquer en quelque sorte la commande en c afin que je puisse obtenir son starr p>
Commencez par la lecture
Man Fork Code>,
Man EXEC CODE> Comment démarrer un processus d'enfant. Regarder dans
man 7 signal code>,
homme sigaction code> et
homme attendre code> pour comment récolter l'enfant. P>
Enfin, le < code> homme DUP2 code>. p>
code non testé pour illustrer: p>
xxx pré> à 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 em> de la tuyau de sorte que la lecture dans le processus parent reçoive réellement EOF. P>
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. P>
On peut aussi utiliser mktemp () (
man 3 mktemp code>) 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. P> blockQuote>