Come può lo stesso fd in processi diversi puntare allo stesso file?


25

Dire che ho il processo 1 e il processo 2 . Entrambi hanno un descrittore di file corrispondente all'intero 4.

In ogni processo, tuttavia, il descrittore di file 4 punta a un file totalmente diverso nella tabella file aperti del kernel:

inserisci qui la descrizione dell'immagine

Come è possibile? Un descrittore di file non dovrebbe essere l'indice di un record nella tabella file aperto?


1
Buona domanda! La mia ipotesi è che i descrittori di file vengano tradotti, in modo che la FD 4in entrambi i processi sia relativa al proprio numero di FD aperti. Gli Fd 0-2(stdin, stdout, sdterr) sono sempre aperti per un nuovo processo e i numeri non sono riservati solo a quel processo.


@ jw013 Ho pensato che suonasse familiare. \ @Pithikos In che modo questo non è un duplicato?
Michael Mrozek

1
Questo è un diagramma scadente - dovrebbe mostrare che il descrittore di file 4 indica la quarta voce [bene, quinta, è contata da zero] della tabella del descrittore di file a sinistra, non una voce che contiene un "4". L'attuale "4" vive nella variabile del tuo spazio utente contenente il numero. Il diagramma nell'altra domanda è molto meglio.
Casuale 832,

2
@ Random832 Beh, se sapessi quale diagramma fosse corretto, probabilmente non avrei mai fatto questa domanda.
Pithikos,

Risposte:


35

Il descrittore di file, ovvero 4nel tuo esempio, è l'indice nella tabella dei descrittori di file specifica del processo , non nella tabella di file aperta. La stessa voce del descrittore di file contiene un indice di una voce nella tabella di file aperti globale del kernel, nonché i flag del descrittore di file.


2
Per la cronaca, esiste solo un "flag descrittore di file" sulla maggior parte dei sistemi, il flag close-on-exec. Tutti gli altri stati "per-fd" (inclusi l'offset e la modalità di accesso) fanno parte della voce della tabella file aperta.
Casuale 832

24

Ogni processo ha una propria tabella descrittore di file. Il descrittore di file 4 nel processo 1234 punti nella tabella del processo 1234. Il descrittore di file 4 nel processo 5678 indica la tabella del processo 5678. Un caso che devi conoscere sono i descrittori di file 0, 1 e 2 che per ogni processo sono l'input standard, l'output standard e l'errore standard, che indicano dove sono stati reindirizzati.

Un processo può aprire lo stesso file più di una volta. Ciò può accadere per coincidenza, ad esempio quando l'output standard di un processo e l'errore standard vengono reindirizzati allo stesso terminale o allo stesso file. Le voci della tabella dei file sottostanti (ad es. Quelle di Linuxstruct file ) contengono più delle informazioni sul file; contengono anche modalità di apertura (ad es. lettura o scrittura) e altri stati (come flag, ad es. close-on-exec). Ad esempio, un processo potrebbe avere un terminale aperto per la lettura solo sul descrittore di file 0 e quello stesso terminale aperto per la scrittura solo sul descrittore di file 2. Le voci delle tabelle dei file contengono anche la posizione del processo nel file; un processo potrebbe voler lseekposizionare due posizioni diverse nello stesso file e quindi usarlo dupper ottenere due handle per quel file.


2
Questo non è del tutto corretto. Secondo la pagina man / specifiche, dupfa esattamente quello che dice sulla tin: entrambi i descrittori risultanti puntano alla stessa voce della tabella dei file e quindi condividono lo stesso offset. Al fine di ottenere 2 diverse voci della tabella dei file, sono abbastanza sicuro che è necessario openil file due volte.
jw013,

@Gilles "Il descrittore di file 4 nel processo 1234 punti nella tabella del processo 1234". Quale tavolo vuoi dire? Da quello che so, l'unica tabella del processo è la tabella dei descrittori di file in cui ogni record punta alla singola tabella di file aperta del kernel .
Pithikos,



7

Un ulteriore livello di riferimento indiretto non risolverebbe il tuo problema? ("Tutti i problemi nella programmazione del computer possono essere risolti con un ulteriore livello di riferimento indiretto" - alcuni saggi greybeard). Cioè, il piccolo numero intero in ogni processo finisce come un indice in una matrice per processo di indici dello spazio del kernel nella "Tabella file aperta".


2
La saggia fonte di greybeard è probabilmente David Wheeler. Sembra anche che abbia detto: " Ma questo di solito creerà un altro problema " :)
jw013,
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.