2015-04-13 5 views
9

Sto leggendo per ore ma non riesco a capire quale sia la differenza tra tra le due serrature. L'unica cosa che capisco è che il blocco fcntl() offre un blocco granulare che può bloccare specifici byte e che solo fcntl() supporta il blocco NFS.Qual è la differenza tra il blocco con `fcntl` e` flock`?

Si dice che la differenza sia nella loro semantica, come si comportano quando vengono duplicati da dup() o mentre fork(), ma non riesco a capire quale sia la differenza nella pratica.

mio scenario è che sto scrivendo un file di log su un server basato su fork(), dove ogni processo biforcuta sta scrivendo allo stesso file quando qualcosa accade. Perché dovrei voler usare flock() e perché dovrei voler usare i lucchetti fcntl()?

+0

Domanda precedente trovata per Linux. La risposta interessante menziona anche Posix. http://stackoverflow.com/questions/22409780/flock-vs-lockf-on-linux –

+0

'flock()' e 'lockf()' sono due cose diverse, 'lockf()' di solito include 'fcntl()' e stavo chiedendo quali sono esattamente la semantica (comportamento rispetto alla chiusura e al passaggio). – Quaker

+0

La risposta che ho collegato inizia * "La differenza pratica tra flock() e lockf() è nella semantica (comportamento rispetto a chiusura e passaggio)" * e come 'lockf()' può racchiudere 'fcntl()' forse che la risposta è pertinente. –

risposta

5

ho cercato di capire le differenze sulla base della documentazione disponibile e ha preso le seguenti conclusioni (per favore correggetemi se sbaglio):

Con fcntl() (POSIX):

  • si crea un record di blocco sul file a livello di file system compreso l'id di processo.

  • Se il processo muore o chiude qualsiasi file in questo file, il record di blocco viene rimosso dal sistema.

  • Una richiesta di blocco esclusivo avrà esito negativo se il descrittore di file non è stato aperto con accesso in scrittura.

  • semplicemente: serrature fnctl lavoro come processo < -> File rapporto, ignorando filedescriptors

flock() (BSD) è diverso (Linux: dal kernel 2.0, flock() è implementato come una chiamata di sistema a sé stante piuttosto che essere emulato nella libreria GNU C come una chiamata a fcntl):

  • flock() crea blocchi su "descrizioni aprire il file" sistemi. "Open file descriptions" sono generati dalle chiamate open().

  • un filedescriptor (FD) è un riferimento a una "Descrizione file aperto". FD generati da dup() o fork() fare riferimento allo stesso "Apri descrizione file".

  • un processo può generare più "descrizioni dei file aperti" per un file aprendo il file() più volte

  • flock() Da vedere è serrature attraverso una decisione quadro su una "descrizione del file Open"

  • pertanto flock() può essere utilizzato per sincronizzare l'accesso ai file tra processi e thread (in uno o più processi).

  • vedere flock(2) e in particolare open(2) pagine man per dettagli su "Apri descrizioni file".

nello scenario probabilmente si desidera utilizzare fcntl() serrature a base, perché si apriranno i processi biforcuta() il file di log da soli e non si aspettano di ereditare una filedescriptor con una serratura possibilmente posizionato.

Se è necessaria la sincronizzazione tra più thread, probabilmente in più di un processo, è necessario utilizzare blocchi basati su flock() se il sistema li supporta senza emulazione da fcntl(). Quindi ogni thread deve aprire() il file invece di usare gli handle dup() ed o fork().

Problemi correlati