Pourquoi n’y a-t-il pas de mécanisme de sondage / sélection de type queue des messages?

Comme nous pouvons le faire, poll / epoll / select sur un fd, nous ne pouvons pas sur l’ID de la queue des messages. J’ai trouvé des méthodes non standard pour transformer msgqueue-id en fd, mais c’est quand même un non standard. Donc ma question est, Pourquoi linux geeks, pas mis en œuvre poll / select sur msg file id? Est-ce que cela mène à un problème sérieux?

Je dois mettre en place un tel mécanisme. Comment puis je faire ça ?

De la page de manuel mq_overview :

Descripteurs de queue de messages d’interrogation

Sous Linux, un descripteur de queue de messages est en fait un descripteur de fichier et peut être surveillé à l’aide de select (2), poll (2) ou epoll (7). Ce n’est pas portable.

Ainsi, vous pouvez utiliser poll et friends sur les files de messages – assurez-vous simplement d’utiliser la variante moderne.

Je suis surpris que cela ne fonctionne pas simplement, mais si cela ne fonctionne pas, je suppose que la raison est d’éviter d’encourager une telle pratique non portable. Bien que les descripteurs de queue de messages soient autorisés à être des descripteurs de fichier, ils ne sont pas obligés de l’être, et le code qui suppose qu’ils sont des descripteurs de fichier (et occupent donc le même “espace de nombres”) n’est pas portable.

Si vous avez besoin de descripteurs de fichiers, il vaudrait probablement mieux utiliser des sockets Unix ou un autre mécanisme à la place des files de messages. Les files de messages semblent être conçues pour être utilisées avec la programmation en temps réel avec des threads où les E / S événementielles basées sur la select / poll ne sont généralement pas utilisées.

Comme le souligne Mat, les MQ POSIX peuvent être utilisés avec select/poll sous Linux. Au-delà, mq_notify () vous fournit les options pour recevoir un signal ou créer un nouveau thread lorsqu’un MQ vide reçoit un message. C’est un autre moyen d’éviter le blocage ou l’interrogation.

SysV MsgQ vous permet de bloquer votre appel msgrcv () pour un type de message particulier ou pour tout type de message utilisant IPC_WAIT. Poll / epoll / select sont utilisés pour vous aider à écrire un programme événementiel dans lequel l’application utilisateur ne gaspille pas la scrutation des cycles de processeur pour un événement particulier et la laisse au meilleur jugement du kernel. C’est ce que vous pouvez également utiliser avec le msg SysV.