J'ai trouvé beaucoup de fils ici demandant comment il est possible de rincer un tuyau après l'avoir écrit sans le fermer. Dans chaque thread, je pouvais voir différentes suggestions, mais je ne pouvais pas trouver une solution définitive.Tuyau de rinçage sans fermeture en C
Voici un résumé rapide:
La meilleure façon d'éviter le blocage de lire sur le tuyau serait d'écrire le nombre exact d'octets qui est en train de lire. Il pourrait également être fait en utilisant ptmx au lieu d'un tuyau, mais les gens ont dit que cela pourrait être beaucoup.
Note: Il est impossible d'utiliser fsync avec des tuyaux
Y at-il d'autres solutions plus efficaces?
Edit:
La chasse serait pratique lorsque l'expéditeur veut écrire des caractères n mais le client lit les caractères m (où m> n). Le client bloquera l'attente d'autres caractères m-n. Si l'expéditeur veut communiquer à nouveau avec le client, il ne peut plus fermer le tube et envoyer juste le nombre exact d'octets pourrait être une bonne source de bugs.
Le récepteur fonctionne comme celui-ci et il ne peut pas être modifié:
while((n=read(0, buf, 100)>0){
process(buf)
si l'expéditeur veut faire traiter: « fichier1 » et « fichier2 » pour qui devra:
write(pipe[1], "file1\0*95", 100);
write(pipe[1], "file2\0*95", 100);
ce que je cherche est un moyen de faire quelque chose comme ça (sans être nécessaire d'utiliser le \ n comme le délimiteur):
write(pipe[1], "file1\nfile2", 11); //it would have worked if it was ptmx
(Utilisation de lecture et d'écriture)
Cela ressemble beaucoup à un [problème X-Y] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). D'une manière générale, il n'y a pas besoin de vider une pipe, alors quel est le vrai problème? –
Et que voulez-vous dire par "pts"? –
@John: Je parlais de pseudoterminal maître/esclave.J'ai mis à jour le message original. –