Descrittore di file e fork


15

Quando un bambino viene biforcito, eredita i descrittori di file del genitore, se il bambino chiude il descrittore di file cosa accadrà? Se il bambino inizia a scrivere cosa succederà al file alla fine del genitore? Chi gestisce queste incongruenze, kernel o utente?

quando un processo chiama la closefunzione per chiudere un particolare file aperto tramite il descrittore di file. Nella tabella dei file del processo, il conteggio dei riferimenti è diminuito di uno. Ma poiché padre e figlio hanno entrambi lo stesso file, il conteggio dei riferimenti è 2 e dopo la chiusura si riduce a 1. Poiché non è zero, il processo continua a utilizzare il file senza alcun problema.

Vedi la programmazione del sistema UNIX di Terrence Chan (supporto del kernel Unix per i file).


Va bene, lasciamo perdere l' ultimo commento;) Nelle pagine man per open()e fork()c'è una distinzione tra un file descrittivo o un file descrittivo - il primo si riferisce al successivo, e sebbene i descrittori in un fork siano copie, si riferiscono alla stessa descrizione. Tuttavia, quando testato è ovvio, ciò non significa che chiudere la maniglia del bambino chiude la maniglia dei genitori. Penso che potrebbe fare una leggera differenza nell'interlacciamento dei dati quando entrambi gli handle scrivono, ma questo è indeterminato, quindi esattamente come accade non è così importante.
Riccioli d'oro,

Risposte:


28

Quando un bambino viene biforcito, eredita i descrittori di file del genitore, se il bambino chiude il descrittore di file cosa accadrà?

Eredita una copia del descrittore di file. Quindi la chiusura del descrittore nel bambino lo chiuderà per il bambino, ma non per il genitore, e viceversa.

Se il bambino inizia a scrivere cosa succederà al file alla fine del genitore? Chi gestisce queste incongruenze, kernel o utente?

È esattamente (come in, esattamente letteralmente) lo stesso di due processi che scrivono nello stesso file. Il kernel pianifica i processi in modo indipendente, quindi probabilmente otterrai i dati interlacciati nel file.

Tuttavia, POSIX (a cui i sistemi * nix sono in gran parte o completamente conformi), stabilisce che read()e le write()funzioni dell'API C (che mappano alle chiamate di sistema) sono "atomiche l'una rispetto all'altra quando [...] funzionano su file regolari o collegamenti simbolici ". GNU C lo promette anche manualmente in via provvisoria per quanto riguarda le pipe (si noti che il valore predefinito PIPE_BUF, che fa parte della condizione, è 64 kiB). Ciò significa che le chiamate in altre lingue / strumenti, come l'uso di echoo cat, dovrebbero essere incluse in quel contratto, quindi se due processi indipendenti provano a scrivere "ciao" e "mondo" contemporaneamente sulla stessa pipe, cosa ne uscirà l'altro fine è "helloworld" o "worldhello", e mai qualcosa del genere "

quando un processo chiama la funzione di chiusura per chiudere un particolare file aperto tramite il descrittore di file. La tabella dei file di processo diminuisce il conteggio di riferimento di uno. Ma poiché padre e figlio hanno entrambi lo stesso file (il conteggio di riferimento è 2 e dopo la chiusura si riduce a 1) poiché non è zero, quindi il processo continua a utilizzare il file senza alcun problema.

Esistono DUE processi, il genitore e il figlio. Non esiste un "conteggio dei riferimenti" comune a entrambi. Sono indipendenti. WRT cosa succede quando uno di loro chiude un descrittore di file, vedi la risposta alla prima domanda.


1

Ogni volta che fork()crea un nuovo figlio, i descrittori di file non vengono affatto conservati, ma cambiati.

Sebbene il file sarà un duplicato, avrà un descrittore di file diverso.

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.