Esiste un file per ciascun socket?


21

"Tutto è un file" nel mondo UNIX.

La frase sopra è famosa. Quando corro echo "hello programmer" >> /dev/tty1, posso guardare la stringa data su TeleType 1 , ....

Cosa e dove è il file per ciascuno socket? Supponiamo che il mio amico si connetta al mio PC e il suo IP sia h.h.h.h, come posso accedere al rispettivo file? È possibile?


3
L'API socket è in realtà una deviazione dalla "politica Unix" a questo proposito, poiché originariamente proveniva da BSD . Nota che c'è sempre Plan 9 di Bell Labs che è "più Unix che Unix" - anche le API di rete e grafiche sono file lì.
ntoskrnl,

prese e processi sono menzionati in buona parte nei documenti del Piano 9, principalmente parlando di dove il modello UNIX è andato storto.
strugee,

Risposte:


9

man 7 unix:

La famiglia di socket AF_UNIX (nota anche come AF_LOCAL) viene utilizzata per comunicare in modo efficiente tra processi sulla stessa macchina. Tradizionalmente, i socket di dominio UNIX possono essere senza nome o associati a un percorso di file system (contrassegnato come di tipo socket). Linux supporta anche uno spazio dei nomi astratto che è indipendente dal file system.

Vale a dire che non tutti i socket possono essere visti come file (nel senso di "nessun file senza un nome di file").

Ma ci sono file con elenchi di socket (ad es. /proc/net/tcp); non è esattamente ciò che significa "tutto è un file".


38

Un socket è un file. Ma non tutti i file hanno nomi. Ecco alcuni esempi di file che non hanno nomi:

  • Qualsiasi file che aveva un nome e ora viene eliminato, ma viene comunque aperto da un programma.
  • Una pipe senza nome , come quella creata dall'operatore |shell.
  • La maggior parte dei socket : qualsiasi socket Internet o un socket Unix che non si trova nello spazio dei nomi del file system (può essere nello spazio dei nomi astratto o senza nome).

I file come pipe o socket senza nome vengono creati da un processo e sono accessibili solo in quel processo o in processi figlio creati successivamente. (Questo non è del tutto vero: un processo che ha una pipe o un socket (o qualsiasi altro file) aperto può trasmetterlo ad altri processi tramite un socket Unix; questo è noto come passaggio del descrittore di file .)

I socket che hanno un nome (nel filesystem o nell'estratto) possono essere aperti usando quel nome. Le prese di rete possono essere aperte (o più precisamente connesse) in remoto da qualsiasi macchina dotata di connettività appropriata.


Questa è la risposta corretta
Jforberg,

4
/proc/<pid>/fd/*e /proc/net/*potrebbe essere interessante
n611x007,

Per favore, accetta questa risposta. È IMHO molto più preciso.
user1202136,

13

Cosa e dove è il file per ciascun socket?

"Tutto" è un'esagerazione. Non è una politica rigorosa, è solo una pratica comune usare il filesystem per le interfacce poiché l'accesso al filesystem è sinonimo di chiamate di sistema (cioè, il filesystem è in realtà un'interfaccia con il kernel, e quindi fornisce un formato conveniente per tutti i tipi di cose) . Altri sistemi operativi non ne fanno tanto uso, quindi è considerata una caratteristica distintiva.

Come menziona Hauke ​​Laging, i socket "unix local" hanno un nodo di file come le named pipe (vedi man fifo). Tuttavia, i socket del protocollo Internet (utilizzati per le comunicazioni di rete) no. Al contrario, sono associati nello spazio utente a un numero di porta. Si noti che un socket del server su una singola porta collega più client ciascuno con il proprio socket individuale (un singolo file socket locale unix può essere utilizzato in questo modo con un server, il che significa che potrebbero esserci più socket associati allo stesso indirizzo di file) e nel codice sono infatti identificati individualmente tramite numerico separato descrittori di file.

Quindi, in questo senso, tutti i socket sono molto simili ai file e hanno un collegamento /proc/[pid]/fd/. Puoi anche chiamare readlink()questo inode e ottenere un tipo speciale di nome file, che viene utilizzato negli strumenti della riga di comando come lsof, credo; allo stesso modo è possibile ottenere informazioni sul descrittore di socket tramite fstat().


Intendi "identificato nello spazio utente dal suo inode"? Non tutti i socket hanno un numero di porta e possono esserci più socket per lo stesso numero di porta (non ha senso, però).
Hauke ​​Laging,

@HaukeLaging: buon punto. Ho modificato per renderlo più chiaro a partire dal secondo paragrafo.
Riccioli d'oro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.