2010-08-13 22 views
9

read (2) e write (2) funziona sia sul descrittore di socket che sul descrittore di file. Nel caso del descrittore di file, tabella descrittore file utente-> tabella file e infine tabella inode dove viene controllato il tipo di file (file normale/char/blocco) e viene letto di conseguenza. In caso di file char spl, ottiene i puntatori di funzione in base al numero maggiore del file dall'interruttore del dispositivo char e chiama le appropriate routine di lettura/scrittura registrate per il dispositivo. La routine di lettura/scrittura è appropriata per il file speciale di blocco ottenendo i puntatori di funzione dall'interruttore del dispositivo a blocchi.descrittore di socket vs descrittore di file

Per favore fatemi sapere cosa succede esattamente quando leggere/scrivere chiamato sul descrittore di socket. Se lavori di lettura/scrittura sul descrittore di socket, non possiamo usare open invece di socket per ottenere il descrittore?

+0

non posso dirvi esattamente ** ** ciò che accade (provare a guardare i sorgenti del kernel se si vuole veramente sapere), ma essenzialmente passerà la richiesta al driver TCP, che la inoltrerà più in basso nello stack di rete fino a raggiungere il driver per la scheda di interfaccia di rete. Se vuoi sapere che cosa fa ogni livello dello stack di rete in termini generali, cerca il * modello OSI *. Per quanto riguarda 'open' vs' socket': prendono argomenti diversi, poiché le informazioni che devono essere specificate sono diverse a seconda che si desideri aprire un file o un socket. – David

+0

Desidero sapere quali sono le strutture dati allocate sul socket chiamante(), quali informazioni sono memorizzate nella tabella inode, come raggiungono le routine dei driver della scheda di interfaccia di rete quando si chiama read/write –

+0

Note read/write wrap the system call. La maggior parte del lavoro è fatta nello spazio del kernel. è una sorta di astrazione, o "virtualizzazione": prendi semplicemente il file di blocco, il socket o molte altre cose, come "file". un file ha operazioni come read, write, open, ecc. Ma la vera implementazione di leggere un socket o leggere un file su disco è definita nel kernel. È anche possibile definire la "scrittura" per leggere dal file, se necessario. – tristan

risposta

2

I descrittori dei socket sono associati anche alle strutture dei file, ma un insieme di funzioni file_operations per quelle strutture differisce dal solito. L'inizializzazione e l'uso di questi descrittori sono quindi diversi. Leggere e scrivere parte dell'interfaccia a livello di kernel è appena successo per essere esattamente equivalente.

+0

Voglio sapere quali sono le strutture dati allocate sul socket chiamante(), quali informazioni sono memorizzate nella tabella inode, come raggiungono le routine dei driver della scheda di interfaccia di rete su chiamata read/write –

+0

non avvenute, piuttosto deliberatamente fatte per essere identiche – Yerken

0

leggere e scrivere sono validi per alcuni tipi di socket in alcuni stati; tutto dipende dalle varie strutture che vengono passate all'interno del kernel.

In linea di principio, open() potrebbe creare un descrittore di socket, ma l'API BSD socket non è mai stata definita in questo modo.

Esistono altri tipi di descrittore di file (un po 'specifici per Linux) che vengono aperti da chiamate di sistema diverse da open(), ad esempio epoll_create o timerfd_create. Funzionano allo stesso modo.

6

Come noto in memoria, il descrittore di file conterrà il flag per identificare il tipo di file system di questo file. Il kernel invocherà la corrispondente funzione del gestore dipende dal tipo di file system. Puoi vedere l'origine read_write.c nel kernel di Linux.

Essere parlare in breve, il kernel ha fatto:

  1. In lettura write.c, c'è una funzione file_system_wrapper, quella corrispondente chiamata di funzione di gestione dipende dal tipo di file di fd (ext2/ext3/zoccolo/..)
  2. In socket.c, esiste una funzione socket_type_wrapper; che chiama la corrispondente funzione di gestore di socket dipende dal tipo di socket (ipv4, ipv6, atm altri)
  3. In socket_ipv4.c, esiste una funzione wrapper di tipo protocol_type; che chiama la corrispondente funzione del gestore di protocollo dipende dal protocollo tpye (udp/tcp)
  4. In tcp_ip4.c; c'è tcp_sendmsg e questa funzione verrebbe chiamata quando si scrive su FD di tipo ipc4 tcp.

Speranza chiaramente, grazie, Houcheng

Problemi correlati