Unix-Socket im lokalen FS und 'rm'

21/03/2013 - 11:31 von Jochen Luebbers | Report spam
Hallo,

ich habe hier eine einfache Client-Server Architektur, wo n Clients
einem Server Nachrichten über einen Unix-Socket -
socket(AF_UNIX, SOCK_DGRAM, 0) - zuschieben. der Server macht seinen
Socket mittels geeignetem bind()-Aufruf im Dateisystem sichtbar und
empfàngt ab dann via recv() Datagramme.

Alles funktioniert soweit auch sehr nett. Wenn ich allerdings den
Eintrag im Dateisystem mittels 'rm <Name von meinem Socket>' lösche,
können die Clients nichts mehr senden, der Server bekommt aber nichts
davon mit. Ich stelle mit vor, dass er mit seinem Socket halt noch brav
auf dem nun "stale Filehandle" hàngt.

Kann man das Verhalten àndern? So dass das Betriebssystem den Prozess
irgendwie informiert (SIGNAL?), wenn sein Socket unerreichbar wird?

Ich habe die man-Pages zu socket(), bind(), sendto() und revc() sowie
unix(7) gelesen, habe aber nichts gefunden (oder eben etwas übersehen),
was in die Richtung geht. Auch ein paar Versuche mit recv()-Optionen
haben an diesem Verhalten nichts àndern können (was mich nicht
überraschte).

Danke im Voraus für alle Hilfe
Jochen
"Who desire to give up freedom in order to gain security
will loose both in the end."
 

Lesen sie die antworten

#1 Rainer Weikusat
21/03/2013 - 14:24 | Warnen spam
Jochen Luebbers writes:
ich habe hier eine einfache Client-Server Architektur, wo n Clients
einem Server Nachrichten über einen Unix-Socket -
socket(AF_UNIX, SOCK_DGRAM, 0) - zuschieben. der Server macht seinen
Socket mittels geeignetem bind()-Aufruf im Dateisystem sichtbar und
empfàngt ab dann via recv() Datagramme.

Alles funktioniert soweit auch sehr nett. Wenn ich allerdings den
Eintrag im Dateisystem mittels 'rm <Name von meinem Socket>' lösche,
können die Clients nichts mehr senden, der Server bekommt aber nichts
davon mit. Ich stelle mit vor, dass er mit seinem Socket halt noch brav
auf dem nun "stale Filehandle" hàngt.

Kann man das Verhalten àndern? So dass das Betriebssystem den Prozess
irgendwie informiert (SIGNAL?), wenn sein Socket unerreichbar wird?



Meines Wissens nach nein. Falls Dein Zielsystem Dir ein API anbietet,
mit dessen Hilfe ein Prozess von Aenderungen im Dateisystem
unterrichtet werden kann (zB dnotify oder inotify fuer Linux)
koenntest Du das benutzen. Andernfalls bliebe nur die Moeglichkeit, in
regelmaessigen Abstaenden 'probe'-Nachrichten an die Socketaddresse zu
schicken und auf dabei auftretende Fehler oder auf das Phaenomen, dass
diese Nachrichten den Server-Teil nie erreichen (weil mittlerweile
'jemand anderes' eine neue Socket mit diesem Namen erzeugt hat)
entsprechend zu reagieren.

Ähnliche fragen