2012-11-25 14 views
24

Per quanto riguarda quel filo: bash flock: exit if can't acquire lockbash flock: Perché 200?

sarò grato se qualcuno può spiegare a me che cosa fa il '200' stare in piedi per.

Ho letto di flock e sembra che 200 se specificare un descrittore di file, ma cosa c'è di buono in questo numero?

+2

È solo un numero di descrittore di file arbitrario. – Mat

risposta

33

Non c'è niente di speciale sul numero 200. È proprio l'esempio utilizzato nella pagina man del comando flock; e capita di essere un numero elevato, quindi è improbabile che sia in conflitto con il descrittore di file di qualsiasi altro file che apri durante lo script.

nel tuo commento, ti chiedi:

( 
    flock -e 200 
    echo "In critical section" 
    sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section" 

Le parentesi () creare una subshell; un nuovo processo, separato dal processo principale. Lo 200>/tmp/blah.lockfile causa l'apertura di tale processo /tmp/blah.lockfile per la scrittura, sul descrittore di file 200. I comandi all'interno delle parentesi vengono eseguiti all'interno di tale shell.

flock -e 200 ottiene un blocco esclusivo sul file indicato dal descrittore di file 200. Un blocco esclusivo significa che chiunque altro cerchi di ottenere un blocco su quel file, esclusivo o condiviso, bloccherà (attendere) finché questo blocco non avrà stato ceduto, o fallito se hanno raggiunto un timeout o chiesto di non bloccare. Quindi, durante il resto del corpo della subshell (i comandi echo e sleep), il blocco sarà trattenuto da quella sottotitola e nessun altro potrà ottenere quel blocco. Una volta terminata la subshell, il file verrà chiuso e il blocco verrà abbandonato.

+0

Grazie. Sono nuovo nello script di bash, potresti spiegarmi il resto del codice: '( flock -e 200 echo" Nella sezione critica " sleep) 200> /tmp/blah.lockfile echo" Dopo la sezione critica "' – Subway

+0

@Rapher Modificato la mia risposta per descrivere come funziona. –

+0

Grazie! C'è una cosa che non capisco, però. Perché è necessaria la subshell? Perché non prendere il blocco prima di eseguire il codice e lasciarlo andare dopo che l'esecuzione del codice è terminata? – Subway

Problemi correlati