termios VMIN VTIME et en bloquant/non bloquant les opérations de lecture
Je suis en train d'écrire un simple C de série de programmes de communication pour Linux. Je suis confus au sujet de l'bloquant/non bloquant lit et VMIN/VTIME relations.
Ma question est, si je doit y avoir des paramètres VMIN/VTIME selon que j'ai un blocage/non-blocage appel?
Par exemple, si j'ai ouvert appel:
open( "/dev/ttyS0", O_RDWR|O_NONBLOCK|O_NOCTTY)
Dois-je régler le VMIN/VTIME:
.c_cc[VTIME] = 0;
.c_cc[VMIN] = 0;
et si j'ai un mode de blocage comme:
open( "/dev/ttyS0", O_RDWR|O_NOCTTY)
dois-je régler le VMIN/VTIME:
.c_cc[VTIME] = 0;
.c_cc[VMIN] = 1;
?
- T-il une différence sur le VMIN/VTIME sont encore bien que le port ouvert les drapeaux sont réglés correctement?
Si quelqu'un pourrait m'aider à comprendre la relation entre VMIN/VTIME et en bloquant ou non bloquant les ports je voudrais vraiment l'apprécier.
Grâce
OriginalL'auteur Arn | 2013-11-22
Vous devez vous connecter pour publier un commentaire.
Andrey est droit. En mode sans blocage, VMIN/VTIME n'ont aucun effet (FNDELAY /O_NDELAY semblent être des variantes de linux de O_NONBLOCK, le portable, POSIX drapeau).
Lors de l'utilisation de select() avec un fichier en mode sans blocage, vous obtenez un événement pour chaque octet qui arrive. À haute la série des débits de données, ce marteaux de la CPU. Il est préférable d'utiliser un mode de blocage avec VMIN, de sorte que select() attend un bloc de données avant la mise à feu d'un événement, et VTIME pour limiter le retard, pour des blocs de plus petite que la valeur VMIN.
Sam a dit "Si vous voulez vous assurer d'obtenir les données, toutes les demi-secondes vous pouvez définir vtime" (VTIME = 5).
De manière intuitive, on peut s'attendre à ce que pour être vrai, mais il ne l'est pas. Le BSD termios homme page l'explique mieux que linux (bien qu'ils travaillent tous les deux de la même façon). Le VTIME timer est un interbyte de la minuterie. Il commence avec chaque nouveau byte arrivant sur le port série. Dans le pire des cas, sélectionnez() peut attendre jusqu'à 20 secondes avant de déclencher un événement.
Supposons que vous avez VMIN = 250, VTIME = 1, et d'un port série à 115200 bps. Aussi, supposons que vous avez un périphérique connecté envoyer les octets lentement, à un rythme régulier de 9 cps. Le temps entre les octets est de 0,11 secondes, suffisamment longtemps pour que le interbyte minuterie de 0,10 point d'expirer, et sélectionnez() pour signaler un lisible pour chaque octet. Tout est bien.
Maintenant, supposons que votre appareil augmente sa vitesse de sortie à 11 cps. Le temps entre les octets est de 0,09 secondes. Il n'est pas assez long pour le interbyte timer expire, et avec chaque nouvelle octet, il recommence. Pour obtenir un lisible événement, VMIN = 250 doit être satisfait. À 11 cps, qui prend de 22,7 secondes. Il peut sembler que votre appareil est bloqué, mais le VTIME conception est la véritable cause de retard.
J'ai testé avec deux scripts Perl, émetteur et le récepteur, deux port série de la carte, et d'un câble null modem. J'ai prouvé qu'il fonctionne comme la page de man dit. VTIME est un interbyte minuterie à zéro avec l'arrivée de chaque nouveau byte.
Une meilleure conception aurait la minuterie ancrée, ne pas rouler. Il serait continuer à retardement jusqu'à ce qu'il expire, ou VMIN est convaincu, selon la première éventualité. Le design pourrait être fixé, mais il y a 30 ans d'héritage à surmonter.
Dans la pratique, on peut rarement de rencontrer un tel scénario. Mais il se cache, alors méfiez-vous.
O_NDELAY
, mais quand VTIME > 0, alors vous ne devriez pas être à l'aide deO_NDELAY
. Est ce que le droit?OriginalL'auteur Trifle Menot
Assurez-vous de unset la FNDELAY drapeau pour le descripteur de l'aide de fcntl, sinon VMIN/VTIME sont ignorés. Série Guide de Programmation POSIX Systèmes d'Exploitation
OriginalL'auteur Andrey Hanin
Je vous recommande d'utiliser vmin et vtime 0 si vous êtes à l'aide de lectures non bloquantes. Qui vous donnera le comportement que si les données sont disponibles, il sera retourné; le fd sera prêt pour sélectionner, sondage, etc chaque fois que des données sont disponibles.
vmin et vtime sont utiles si vous êtes en train de faire le blocage de lit. Par exemple, si vous vous attendez à un particulier de la taille de paquet vous pouvez alors régler la valeur vmin. Si vous voulez vous assurer d'obtenir les données, toutes les demi-secondes vous pouvez définir vtime.
Évidemment vmin et vtime sont uniquement à des fins non-canonique (non-mode ligne)
Mon soupçon est que en mode non bloquant si vous définissez la valeur vmin dire à 5, puis le fd ne sera pas le lire, de prêt et de lecture sera de retour EWOULDBLOCK jusqu'à 5 caractères sont prêts. Je ne sais pas et n'est pas facile de cas de test pour essayer, parce que toute la série de travail que j'ai fait a été de blocage ou a régler sur 0.
OriginalL'auteur Sam Hartman