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 echo
o 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.
open()
efork()
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.