Attendre un socket Unix à être lié
-
21-09-2019 - |
Question
Je suis en train d'écrire une application client qui se connecte à un processus de serveur via un socket de domaine Unix. Si le processus de serveur ne fonctionne pas, je veux que le client d'attendre jusqu'à ce que le serveur a démarré et est à l'écoute des connexions sur la prise.
Actuellement, j'ai une boucle de nouvelle tentative dans le client qui appelle connect () chaque seconde jusqu'à ce qu'il se connecte avec succès à la prise.
Y at-il fonction que je peux appeler qui simplement bloquer jusqu'à ce qu'une prise du nom particulier (par exemple « / var / MySock ») est créé et lié à un processus serveur?
La solution
Pas une réponse complète, mais ...
Si vous êtes sous Linux, l'interface inotify
vous permettra de piéger une des premières étapes utiles de l'opération:
-
unlink
'ing une prise ancienne restes déclenchera uneIN_DELETE_SELF
sur elle. -
bind
'ing déclenche uneIN_CREATE
sur le répertoire parent.
Malheureusement, le serveur ne connect
'able jusqu'à ce qu'il listen
. Bien que ce soit la prochaine étape logique, il n'y a vraiment aucune garantie que cela fera tout de suite. Il ne semble pas que inotify
fournit une interface pour cela.
Autres conseils
Je sais que c'est une question très ancienne, mais cela peut aider les nouveaux arrivants qui arrivent ici via Google avec le même problème.
Si la portabilité est une préoccupation, et comme principe directeur, il doit toujours être, alors la façon dont vous le faites est tout à fait correct. Parfois, la solution la plus évidente est la bonne. Si vous êtes préoccupé par la surcharge de tenter une connect()
si souvent, dans votre boucle d'essai au lieu faire une stat()
sur la prise et si cela fonctionne, vérifiez qu'il est vraiment une prise en utilisant la macro S_ISSOCK()
qui vient de stat.h
. Une seule fois tout ce qui est vrai ce que vous essayez le connect()
.
Le seul moment où vous devez vous soucier de notifications asynchrones de fantaisie est si l'application cliente peut ou devrait faire d'autres travaux alors qu'il attend que le serveur pour démarrer. Ce n'est pas typique, mais je peux imaginer des cas où vous voudrez peut-être le faire. Dans ce cas, je voudrais simplement avoir la tentative de connexion dans un thread séparé. Il y a des nuances ici que je peux entrer dans si vous sentez qu'il serait approprié, mais je pense qu'il est trop pour un simple « attendez que le serveur à venir en vie » boucle de type.