2012-07-04 1 views
6

Unix rappresenta i file aperti con tre strutture dati: Descriptor table, File table e v-node table.
Quando un processo apre un file due volte, ottiene due diversi descrittori nello descriptor table, due voci nello file table (in modo che abbiano posizioni diverse nello stesso file) e entrambi puntano a una voce nello v-node table.
E il processo figlio eredita il processo padre descriptor table, quindi il kernel mantiene uno descriptor table rispettivamente per ciascun processo. Ma due descrittori di processi diversi indicano la stessa voce in open file table.
Così
Due descrittore di file da diversi punti processo per la stessa voce nella tabella dei file aperti del kernel

  1. Quando il processo bambino fa qualche lettura sul file, sarebbe l'offset della stessa modifica file in processo genitore?
  2. Se 1 è vero, per due processi, c'è un modo conveniente per ottenere lo stesso effetto di fork sullo stesso file? Ciò significa che due processi condividono le informazioni sulla posizione (offset) sullo stesso file.
  3. C'è un metodo di fork in modo che entrambi i processi abbiano tabelle totalmente non correlate, come due processi non correlati solo che hanno aperto gli stessi file.

risposta

8

Quando il processo bambino non qualche legge sul file, sarebbe l'offset della stessa modifica file in processo genitore?

Sì, poiché l'offset è memorizzato nella tabella di file a livello di sistema. È possibile ottenere un effetto simile utilizzando dup o dup2.

Se 1 è vero, per due processi, esiste un modo conveniente per ottenere lo stesso effetto di fork sullo stesso file? Ciò significa che due processi condividono le informazioni sulla posizione (offset) sullo stesso file.

C'è una tecnica chiamata "passare il descrittore di file" usando socket di dominio Unix. Cerca i dati "secondari" in sendmsg.

C'è un modo per fork in modo che entrambi i processi abbiano tabelle totalmente non correlate, come due processi non correlati solo che hanno aperto gli stessi file.

È necessario il file open per ottenere questo risultato. Anche se non fa quello che vuoi, dovresti cercare anche il flag FD_CLOEXEC.