12
votes

Comment puis-je mettre en œuvre «tee» par programme en C?

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?


1 commentaires

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 ..?


5 Réponses :


7
votes

vous pouvez popen () le programme TEE.

ou vous pouvez Fork () et tuyau stdout à travers un processus d'enfant telle Comme cela (adapté d'un vrai programme en direct, j'ai écrit, il fonctionne donc!): xxx


3 commentaires

+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.



-2
votes

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.

Mais cela a l'air un peu laid et je dois dire que je n'ai pas essayé cela.


2 commentaires

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.



1
votes

Vous pouvez utiliser FORKPTY () avec Exec () pour exécuter le programme surveillé avec ses paramètres. Forkpty () 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.

La deuxième partie consiste à lire dans une boucle la sortie du programme et à l'écrire dans un fichier et à l'imprimer sur stdout.

exemple. : xxx


1 commentaires

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.



2
votes

Vous pouvez utiliser pipe (2) et DUP2 (2) 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 avant de connecter le tuyau). Mais vous auriez besoin d'un fil de fond.

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).


0 commentaires

6
votes

Le " popen () tee" Les réponses étaient correctes. Voici un exemple de programme qui fait exactement que: xxx

explication:

popen () renvoie un fichier , mais DUP2 () attend un descripteur de fichier (FD), donc fileno () convertit le fichier * sur une fd. Ensuite, DUP2 (..., stdout_fileno) dit pour remplacer stdout avec la FD de popen () .

Signification, vous apparaissez un processus d'enfant ( popen ) qui copie toutes ses entrées sur stdout et un fichier, alors que vous portez votre stdout à ce processus.


0 commentaires