Sto scrivendo un server socket di dominio Unix per Linux.Come sapere se un processo è associato a un socket di dominio Unix?
Una particolarità dei socket di dominio Unix Ho scoperto rapidamente che, mentre si crea un socket Unix in ascolto, si crea la voce corrispondente del filesystem, chiudendo il socket non lo si rimuove. Inoltre, fino a quando la voce del filesystem non viene rimossa manualmente, non è possibile effettuare il bind()
un socket per lo stesso percorso: bind()
fallisce con EADDRINUSE
se il percorso è già presente nel file system.
Di conseguenza, la voce del file system del socket deve essere unlink()
'su spegnimento del server per evitare di ottenere EADDRINUSE
al riavvio del server. Tuttavia, questo non può sempre essere fatto (vale a dire: crash del server). La maggior parte delle domande frequenti, i messaggi del forum, Q & Un sito Web che ho trovato consigliare solo, come soluzione, a unlink()
il socket prima di chiamare bind()
. In questo caso, tuttavia, è preferibile sapere se un processo è associato a questo socket prima di quello unlink()
.
Infatti, unlink()
'un socket Unix mentre un processo è ancora associato a esso e quindi ricreare il socket di ascolto non genera alcun errore. Di conseguenza, il vecchio processo del server è ancora in esecuzione ma irraggiungibile: il vecchio socket di ascolto è "mascherato" dal nuovo. Questo comportamento deve essere evitato. Idealmente, usando i socket di dominio Unix, l'API socket dovrebbe avere esposto lo stesso comportamento di "mutua esclusione" esposto quando si vincolano i socket TCP o UDP: "Voglio associare il socket S all'indirizzo A, se un processo è "Purtroppo questo non è il caso ...
C'è un modo per far rispettare questo comportamento di" mutua esclusione "? Oppure, dato un percorso del filesystem, c'è un modo per sapere, via l'API socket, se qualche processo sul sistema ha un socket di dominio Unix legato a questo percorso? Devo utilizzare una primitiva di sincronizzazione esterna all'API socket (flock()
, ...)? O mi sta sfuggendo qualcosa ?
Grazie per i vostri suggerimenti.
Nota: i socket Unix dello spazio dei nomi di Linux sembrano risolvere questo problema, in quanto non esiste una voce del file system su unlink()
. Tuttavia, il server che sto scrivendo vuole essere generico: deve essere robusto contro entrambi i tipi di socket di dominio Unix, in quanto non sono responsabile della scelta degli indirizzi di ascolto.
Grazie per la risposta. Usare un sistema di lockfile tradizionale è sicuramente il modo più sicuro per andare. Inoltre, se un sistema di rilevamento di servizi è eccessivo o meno: ironicamente, questo server è progettato per essere parte di un sistema di individuazione di servizi da solo (il sistema di "registrazione" di servizio sembra più appropriato). Questo dovrebbe rispondere alla tua domanda ;-) –