Re: tar > redet zu viel!

From: Bernd Walter <ticso(at)cicely9.cicely.de>
Date: Tue, 18 Feb 2003 14:23:50 +0100

On Tue, Feb 18, 2003 at 01:53:21PM +0100, Oliver Fromme wrote:
> Bernd Walter <ticso(at)cicely9.cicely.de> wrote:
> > On Tue, Feb 18, 2003 at 12:48:50PM +0100, Oliver Fromme wrote:
> > > Sie verhalten sich auch exakt genauso -- der einzige Unter-
> > > schied ist, daß UNIX-Domain-Sockets im Filesystem sichtbar
> > > werden und somit der UFS-Semantik unterliegen bzgl. Eigen-
> > > tümer, Zugriffsrechten usw., und daß man nicht remote auf
> > > sie zugreifen kann.
> >
> > Ein Unix Domain Socket kann im Filesystem sichtbar sein,
> > muß es aber nicht.
>
> Naja, nicht mehr oder weniger als eine normale Datei (deren
> Verzeichniseintrag im Dateisystem kann man auch löschen,
> obwohl die Datei noch vorhanden ist, wenn ein programm sie
> noch geöffnet hat).

Eine Datei ohne Namen ist aber noch mit dem Dateisystem verknüpft.
Ein Domain Socket nicht.

> > Klassische Beispiele sind socketpair(2) und etablierte Verbindungen.
>
> socketpair() hat eher die Semantik von pipe() als die von
> socket(); Du kannst z.B. kein connect() und kein listen()
> drauf machen. (Tatsächlich ist bei vielen Systemen pipe()
> mit Hilfe von socketpair() implementiert, indem einfach
> eine Hälfte zugemacht wird.)

Auf einen etablierten TCP/IP connect kann ich auch keinen connect()
oder listen() machen.
Es ist denoch ein IP Socket.
socket() ist nicht die einzige Möglichkeit einen Socket aufzumachen.
Man denke nur an accept(), die Funktion liefert einen neuen Socket.
Genauso macht socketpair PF_UNIX/PF_LOCAL sockets auf - nur ohne den
Umweg über einen listen.
socketpair hat keineswegs die Semantik von pipe - es sind reinrassige
Unix Domain Sockets, über die man z.B. auch Filedescriptoren
distributieren kann, was über eine Pipe nicht geht.
Ich nutze das Feature z.B., um geforkten Childs einen Kanal bereit-
zustellen, über den ich im Betrieb weitere Descriptoren vermitteln
kann - klassischer Netzservice mit preforked Childs.
Das man pipe() über socketpair() Implementieren kann ist klar, aber
letzlich deshalb, weil ein Domainsocket ein Superset der Features
einer Pipe liefert.
Nein - es wird bei der Pipe Implementierung über socketpair keine
Hälfte zugemacht - man kann einen Socket nicht halb zumachen.
Deshalb gibt es auch einige Systeme, die mit pipe(2) bidirektionale
Pipes aufmachen, was keineswegs vorgeschrieben aber erlaubt ist.
FreeBSD liefert z.B. bidirektionale Pipes, allerdings gibt es einen
eigenen syscall dafür - keine Ahnung, ob das im Kernel per Sockets
realisiert sind oder nicht.

Prüfe mal per netstat -af unix, wieviele Sockets ohne Namen sind.
Ich kann dir garantieren, daß die alle auch niemals einen hatten.
Ganz im Gegensatz zu deinem Beispiel mit dem gelöschten File.

-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso(at)cicely.de         Usergroup           info(at)cosmo-project.de
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 18 Feb 2003 - 14:24:01 CET

search this site