2010-04-20 26 views
2

Comment déterminer si je peux écrire le nombre donné d'octets à un handle de fichier (socket réellement)? (Sinon, comment « non lu » les données que j'avais lu d'autres filehandle?)Déterminez combien je peux écrire dans un descripteur de fichier; copier des données d'un FH à l'autre

Je veux quelque chose comme:

 
n = how_much_can_I_write(w_handle); 
n = read(r_handle, buf, n); 
assert(n==write(w_handle, buf, n)); 

Les deux (r_handle et handles de fichiers w_handle) ont reçu le statut de prêt epoll_wait.

Je souhaite que toutes les données de r_handle soient copiées dans w_handle sans utiliser de tampon "write debt".

En général, comment copier les données d'un handle de fichier à l'autre de manière simple et fiable?

@related How can I "interconnect" two sockets in Linux?

Répondre

0

Vous ne pouvez pas le faire - une fois que les données sont écrites, il est écrit - l'opération est réversible ou prévisible à l'avance. Vous devez repenser votre logique de programme.

+0

Il n'y avait pas d'inversion d'écriture proposée. L'inversion de lecture a été proposée en tant que solution alternative (par exemple, repousser les données vers un certain tampon dans le noyau). Je pense que si le noyau marque mon handle de fichier comme prêt à l'écriture (dans 'epoll_wait') alors il sait combien je peux écrire sans risque de finir bloqué ou écrit trop peu (et devoir se souvenir du reste quelque part). –

0

Je ne pense pas qu'il y ait une interface qui vous permette d'accéder à cette information, et elle serait périmée dès que vous l'auriez obtenue. Je suggérerais de mettre les deux descripteurs de fichiers à non bloquants, puis de lire/écrire des blocs de 1K (peut-être plus grands) jusqu'à obtenir EAGAIN/EWOULDBLOCK, quand vous devriez mettre en cache un bloc jusqu'à ce que l'écriture fd soit prête.

Vous avez besoin d'un tampon pour faire le cycle de lecture/écriture de toute façon, donc garder le tampon pour la dette d'écriture devrait être trop un problème?

+0

Oui, toutes les prises sont non bloquantes. Je veux empêcher la mise en cache en ne lisant pas le côté lecture si je ne suis pas sûr d'écrire. epoll_wait me dit quand je peux écrire, mais je ne sais pas combien je peux écrire en toute sécurité. –