Je recherche un moyen de manière programmatique (c.-à-d. N'utilisation pas de la redirection de la ligne de commande) Implémentez la fonctionnalité «TEE» de sorte que mon stdout se rend à la fois à STDOUT et à un fichier journal. Cela doit fonctionner à la fois pour mon code et toutes les bibliothèques liées qui produisent sur stdout. Toute façon de faire cela? P>
5 Réponses :
vous pouvez ou vous pouvez popen () code> le programme TEE.
Fork () code> et tuyau
stdout code> à travers un processus d'enfant telle Comme cela (adapté d'un vrai programme en direct, j'ai écrit, il fonctionne donc!): p>
+1 pour ne rien assumer (par exemple, le code ci-dessus est facilement adaptateur à la prise d'un descripteur de fichier déjà ouvert au lieu d'un nom de fichier comme argument)
tee ("tee.txt"); système ("ftp"); -> Ne semble-t-il pas imprimer stdin ou stdout aucune idée?
Une fois que j'ai enlevé: si ('\ n' == ch) il imprime. Je suppose que ça attendait \ n. Maintenant, la fonction TEE semble être bloquée à moins que je puisse appuyer sur Entrée à la fin.
Il n'y a pas de manière triviale de faire cela dans C. Je soupçonne que le plus facile serait d'appeler popen (3), avec Tee comme commande et le fichier journal souhaité en tant qu'arument, puis dup2 (2) le descripteur de fichier Fichier nouvellement ouvert * sur FD 1. P>
Mais cela a l'air un peu laid et je dois dire que je n'ai pas essayé cela. P>
Essayé cela et provoque des conditions de course. Un problème peut être que Tee imprime d'abord parfois.
@Palen comme je l'ai dit, "non testé et a l'air moche". Si vous utilisez GNU Libc, il existe une fonctionnalité de création de vos propres objets de fichier * et vous pourriez l'utiliser, mais vous vous retrouverez dans une terres absolument.
Vous pouvez utiliser La deuxième partie consiste à lire dans une boucle la sortie du programme et à l'écrire dans un fichier et à l'imprimer sur stdout. P> exemple. : p> FORKPTY () CODE> avec
Exec () code> pour exécuter le programme surveillé avec ses paramètres.
Forkpty () Code> renvoie un descripteur de fichier qui est redirigé vers les programmes STDIN et STDOUT. Tout ce qui est écrit sur le descripteur de fichier est l'entrée du programme. Tout ce qui est écrit par le programme peut être lu à partir du descripteur de fichier.
Mais cela signifie exécuter son programme d'un autre programme, n'est-ce pas? Vraisemblablement, il veut éviter cela, sinon il serait prêt à utiliser le T-shirt.
Vous pouvez utiliser En réalité, je pense que la méthode de Tee-shirt popen suggérée par Vatine est probablement plus simple et plus sûre (tant que vous n'avez pas besoin de faire plus de supplément avec le fichier journal, tel que l'horodatage ou le codage ou quelque chose). P> pipe (2) code> et
DUP2 (2) code> pour connecter votre standard sur un descripteur de fichier que vous pouvez lire. Ensuite, vous pouvez avoir une surveillance de fil séparée que le descripteur de fichier, écrire tout ce qu'il contient dans un fichier journal et l'original Stdout (enregistré AvaN à un autre FileDeScriptor par
DUP2 code> avant de connecter le tuyau). Mais vous auriez besoin d'un fil de fond. P>
Le " explication: p> Signification, vous apparaissez un processus d'enfant ( popen () code> tee" Les réponses étaient correctes. Voici un exemple de programme qui fait exactement que:
popen () code> renvoie un fichier
code >, mais
DUP2 () code> attend un descripteur de fichier (FD), donc
fileno () code> convertit le fichier
* code> sur une fd. Ensuite,
DUP2 (..., stdout_fileno) code> dit pour remplacer stdout avec la FD de
popen () code>. P>
popen code>) qui copie toutes ses entrées sur stdout et un fichier, alors que vous portez votre stdout à ce processus. P> P>
Puis-je demander à un détail plus précis de pourquoi avez-vous besoin d'une telle solution? Est-ce de sauvegarder sur le débogage ..?