C: comment faire pour rediriger stderr à partir du Système de commande sur la sortie standard ou fichier?
La commande shell $ avrdude -c usbtiny
sorties du texte sur la sortie stderr. Je ne peux pas le lire avec commmands comme chef-moins-plus de cos il n'est pas sortie standard (stdout). Je veux que le texte sur la sortie standard ou dans 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 pas résolus.
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas essayé quelque chose comme ça dans OpenBSD, mais au moins quelques systèmes *nix, vous pouvez le faire à l'aide de
dup2
.La façon normale serait quelque chose comme:
Il dirige ce qui serait normalement aller vers stderr pour aller vers la sortie standard à la place. Si vous préférez diriger vers un fichier, vous pourriez faire quelque chose comme:
Celui-ci utilise la fonction POSIX pour dupliquer la sortie standard numéro de dossier dans la norme de l'erreur du numéro de fichier. La duplication stderr vers stdout est donnée dans la norme POSIX page pour
dup2
comme exemple d'utilisation de la fonction.De commencer par lire
man fork
,man exec
sur la façon de démarrer un processus enfant. Regarder dansman 7 signal
,man sigaction
etman wait
pour la façon de récolter de l'enfant.Enfin, la
man dup2
.Code non testé pour illustrer:
À l'aide de dup2() nous remplacer stderr (qui est fd 2) de l'enfant avec une écriture à la fin du tube. pipe() est appelée avant le fork(). Après la fourchette nous avons également fermer toutes les pendaison extrémités de la conduite, de sorte que la lecture dans le processus parent recevra un EOF.
Il y a probablement une solution plus simple à l'aide de stdio, mais je ne suis pas au courant. Depuis popen() exécute la commande par le shell, probablement un peux rediriger stderr vers stdout (et de l'envoyer sur la sortie standard vers /dev/null). Jamais essayé.
On peut aussi utiliser mktemp() (
man 3 mktemp
) pour créer un fichier temp nom, composer de commande de système() pour rediriger stderr de la commande vers le fichier temp et après que le système() retourne lire le fichier temp.