2016-01-16 11 views
11

Quando si crea un socket unix, il nome del percorso (man 7 unix) può contenere al massimo 108 caratteri. Per un amico questo ha causato un bug nel suo programma perché il suo percorso era più lungo. Ora ci chiediamo come è stato determinato esattamente quel numero.Perché la lunghezza massima del percorso è consentita per i socket unix su linux 108?

ho il sospetto che il numero è stato determinato in modo che sizeof di quel struct sockaddr_un è inequivocabile rispetto al sizeof di altri sockaddresses come sockaddr_in. Ma se volevano evitare scontri con altri valori sizeof, perché non usare un numero primo, per esempio? Qualcuno può fornire una fonte autorevole per questo?

+2

Perché un numero primo dovrebbe evitare la dimensione di altri tipi? –

+0

@EdHeal Forse mi sbaglio, ma sommare i multipli di 2 (causati dagli allineamenti) non renderà più una struttura che corrisponde alla sua dimensione. In alternativa avrei potuto chiedere, perché usare un numero pari se l'obiettivo sarebbe quello di evitare gli scontri? Il che sembra indicare che il mio sospetto riguardo al numero potrebbe essere errato. –

+1

Sono ammesse molte strutture multiple a due (probabilmente la metà di esse). Ma fare qualcosa delle dimensioni di un numero primo non evita gli scontri. Ad ogni modo, che senso ha farlo se il programmatore sta ottenendo questa parte fondamentale sbagliata e usando la struttura sbagliata. –

risposta

3

Se non riesci a trovarlo qualche volta significa solo che non c'è niente da trovare. Ma può anche significare che non potresti trovarlo. Tuttavia, mi piacerebbe condividere quello che ho trovato finora e

Faccio la difficile congettura che il numero è arbritario.

La mia ipotesi è supportata da queste due dichiarazioni del GNU C Library:

char sun_path[108]

Questo è il nome del file da utilizzare. Incompleto: Perché 108 è un numero magico? RMS suggerisce di creare una matrice a lunghezza zero e di modificare l'esempio in seguito all'utilizzo di alloca per allocare una quantità appropriata di memoria in base alla lunghezza del nome file.

(Dove RMS dovrebbe essere Richard M. Stallman (un'altra ipotesi))

Data Tipo: struct sockaddr
...

char sa_data[14]

Questo è il vero e proprio dati di indirizzo socket, che dipende dal formato. La sua lunghezza anche dipende dal formato e potrebbe essere superiore a 14. La lunghezza 14 di sa_data è essenzialmente arbitrario.

PS: Non so perché, ma questo tipo di domande mi rende davvero curioso.

4

Doveva corrispondere allo spazio disponibile in una pratica struttura di dati del kernel.

EDIT:

Citando "la progettazione e realizzazione del sistema operativo 4.4BSD" di McKusick et. al. (Pagina 369):

impianti di gestione dei

la memoria ruotano attorno a una struttura di dati chiamata mbuf. Mbufs, o buffer di memoria, sono lunghi 128 byte, con 100 o 108 byte di questo spazio riservato per l'archiviazione dei dati.

+0

Sei in grado di fornire alcuni più specifici (come la struttura dei dati del kernel in questione)? –

+0

@MichaelBurr risposta modificata con alcuni dettagli. –