Définir la taille du tampon de tuyau
J'ai un C++ application multithread qui utilise posix tuyaux afin d'effectuer inter thread de communication efficace (donc je n'ai pas à devenir fou avec les blocages).
J'ai mis de l'opération d'écriture non bloquante, l'écrivain obtiendrez un message d'erreur si il n'y a pas assez d'espace dans la mémoire tampon d'écriture.
if((pipe(pipe_des)) == -1)
throw PipeException();
int flags = fcntl(pipe_des[1], F_GETFL, 0); //set write operation non-blocking
assert(flags != -1);
fcntl(pipe_des[1], F_SETFL, flags | O_NONBLOCK);
Maintenant, je voudrais souhaiter fixer le tuyau taille de la mémoire tampon à une valeur personnalisée en un mot (dans le cas spécifique).
J'ai cherché sur google mais je n'ai pas été en mesure de trouver quelque chose d'utile. Est-il un moyen (éventuellement conformes à posix) de le faire?
Grâce
Lorenzo
PS: je suis sous linux (si ça peut être utile)
source d'informationauteur Zeruel
Vous devez vous connecter pour publier un commentaire.
Puisque vous avez mentionné que vous êtes sur Linux et ne peut pas l'esprit de la non-portabilité, vous pouvez être intéressé par le descripteur de fichier manipulateur F_SETPIPE_SZ, disponible depuis Linux 2.6.35.
Vous trouverez que
pipe_sz == getpagesize()
après l'appel, depuis le tampon ne peut pas être plus petit que la taille de la page. Voirfcntl(2)
.J'ai googlé "linux pipe taille de la mémoire tampon" et a obtenu ce que le lien en haut. En gros, la limite est de 64 ko et est codé en dur.
Je ne suis pas sûr pourquoi vous essayez de définir la limite inférieure, il semble comme une idée étrange pour moi. Si vous voulez de l'auteur à attendre jusqu'à ce que le lecteur a traité de ce qu'il a écrit, vous devez utiliser un tuyau dans l'autre sens pour le lecteur de renvoyer un accusé de réception.
Vous pouvez utiliser une mémoire partagée de la zone( System V ) de deux termes, l'un pour l'envoi de données et l'autre pour la réception de données, et de mettre en œuvre vos tuyaux avec eux.
d'autres solutions, comme vous l'a constaté précédemment, sont sur la recompilation du noyau que vous aimeriez avoir, mais il n'est pas le cas, je suppose.
Ciao!