2016-01-19 14 views
7

Ho un'applicazione server che crea un socket di dominio UNIX in un percorso specifico con un nome e bind() s ad esso.Come posso cancellare un file Socket di dominio UNIX quando esco dall'applicazione?

Ho bisogno di cancellare il socket solo quando chiudo/chiudo l'applicazione intenzionalmente, all'interno del codice dell'applicazione; altrimenti deve essere aperto. Come faccio a fare questo?

Grazie!

Modifica: Considera che avvio e eseguo la mia applicazione dall'interno di un terminale.

risposta

11

Stai rendendo questo più difficile di quanto dovrebbe essere. Inserisci lo unlink() subito prima dello bind(). Ecco come lo fanno tutti gli altri. (Esempio: BSD syslogd, uno dei classici servizi basati su socket unix-dominio)

+0

grazie. Pensavo di dover andare dopo il legame. grazie per aver specificato che doveva andare prima. – Pheonix7

+0

Si potrebbe ancora fare uno scollegamento all'uscita per impedire che il socket stantio venga visualizzato nelle liste di directory quando il server non è in esecuzione. Ma è puramente cosmetico. –

1

Basta eseguire

unlink("Path/to/Socket"); 

prima di chiudere il programma.

+0

ma esco dall'applicazione dal terminale, quindi dove dovrei inserire lo scollegamento nel codice? – Pheonix7

0

È possibile rimuovere il file di socket con un semplice:

unlink(path); 

Ovunque si programma di uscita del programma, verificare se esiste, e rimuoverlo.

+0

ma esco dall'applicazione dal terminale, quindi dove inserisco lo scollegamento nel codice? – Pheonix7

+0

Non importa da dove esci dall'applicazione, a meno che tu non stia dicendo che stai premendo 'Control-C' o qualcosa del genere. In tal caso, è necessario creare un gestore di segnale che si occupi della presa prima di uscire. –

2

Se si dispone di più punti di uscita dall'applicazione e non si desidera modificare ciascuno di essi per chiamare la routine di pulizia, è possibile utilizzare un approccio "sporco".

Quando il socket è appena stato creato, registrare la routine di pulizia con atexit(3). La routine (che è semplicemente una chiamata a unlink(2)) verrà chiamata quando l'applicazione viene terminata normalmente. Ma non verrà chiamato se l'applicazione viene terminata con il segnale. Quindi, se si desidera eseguire la pulizia dopo aver ricevuto SIGINT e segnali simili, è necessario anche impostare correttamente i gestori di segnale.

+0

ok, ma il file rimane ancora lì. Ho anche bisogno di cancellare il file dalla cartella – Pheonix7

+0

@ Pheonix7, hai controllato il codice di uscita di unlink per gli errori? – gudok

+0

quando esco dall'applicazione con ctr + c il terminale non dice nulla. Quando riavvio l'applicazione ottengo un errore di binding: Indirizzo in uso – Pheonix7