2010-08-10 16 views
2

J'avais un cas d'utilisation pour un serveur de discussion de groupe où le serveur devait écrire une chaîne commune à la socket de tous les clients. Je l'avais alors traité en faisant une boucle sur la liste des descripteurs de fichiers et en écrivant la chaîne dans chacun des descripteurs de fichiers. Maintenant, je pense à trouver une meilleure solution au problème. Est-il possible de le faire par un appel de fonction unique à partir du serveur en utilisant l'appel du système tee dans Linux. Je veux que la sortie d'un tee-shirt se rende au prochain tee aussi bien que sur une socket client. Je me demande si je peux copier le descripteur de fichier d'une extrémité du tee à la prise des clients et obtenir l'effet désiré.Écriture dans plusieurs descripteurs de fichier avec un seul appel de fonction

Veuillez suggérer toute autre implémentation pour le cas d'utilisation que vous connaissez.

Merci

+0

Que croyez-vous que vous allez gagner? – JeremyP

+0

Comme je l'ai mentionné dans le cas d'utilisation, je veux être en mesure d'écrire une fois (en utilisant un seul appel système) à plusieurs descripteurs de fichiers. J'expérimentais avec tee et je réalise que ce tee ne sera pas utile pour y parvenir. –

Répondre

2

L'appel système tee(2) nécessite les deux descripteurs de fichier à tuyaux - donc prises ne comptent pas. Les appels système splice(2) et vmsplice(2) ne semblent pas non plus répondre à vos besoins, et je ne vois pas non plus comment utiliser sendfile(2).

Je n'ai pas rencontré un tel appel système. Demande de rassembler des données diverses et de les écrire toutes en même temps (ou l'inverse pour la lecture) - oui. Mais pour écrire sur plusieurs sorties à la fois - non. Donc, votre «boucle autour des descripteurs» est à peu près aussi bonne que possible, AFAICT.

+0

Hé, ça arrive un peu tard, mais néanmoins: tee, splice et vmsplice sont en effet ce que l'OP voudrait utiliser. D'abord 'vmsplice (GIFT)' pour obtenir les données dans un tube (buffer du noyau), puis 'tee' avec un autre tube, suivi de' splice (MOVE) 'une fois pour chaque socket. Le problème est que la documentation ne permet pas de saisir facilement les drapeaux à utiliser pour éviter les copies, et elle n'est pas non plus cohérente avec la propagande «nous disons copie, mais c'est vraiment la magie des tables de pages la plupart du temps». Ce n'est pas évident quand/si vous pouvez récupérer/réutiliser votre mémoire, ou quand/si quelque chose bloque, non plus. – Damon