2013-06-07 16 views
5

flock() è generalmente async-signal-safe perché è una chiamata di sistema. La sua semantica rende difficile implementarla in modo diverso. Non è nel list di POSIX delle funzioni async-signal-safe perché non è affatto in POSIX.Utilizzare flock() nel gestore sigaction

È possibile utilizzare flock() nel gestore di sigaction senza problemi?

+1

La documentazione di Mac OS X per 'flock()' non fornisce alcun aiuto diretto. Non c'è motivo di supporre che 'flock()' pasticcia con le strutture dello spazio utente, quindi ci sono tutte le ragioni per pensare che sia async-signal-safe, ma non è conclusivo. La funzione 'fcntl()', che è la chiamata al sistema di chiusura POSIX, è async-signal-safe, che supporta la vista che 'flock()' può essere implementato in modo da essere async-signal-safe, ma non è ancora prova . Forse dovresti eseguire l'upgrade per usare 'fcntl()', e poi saprai che sei al sicuro. –

+0

@JonathanLeffler Cna Io uso 'flock()' per bloccare e 'fcntl()' per sbloccare? – MOHAMED

+0

Per favore vedi la mia risposta aggiuntiva alla tua domanda iniziale qui: http://stackoverflow.com/a/16979601/694576 – alk

risposta

0

Secondo @alk risposta nella seguente topic:

Siamo in grado di sviluppare la nostra funzione di proprietà flock() (il suo nome potrebbe essere async_flock()). copiamo in questa nuova funzione il contenuto del codice di origine lockf() e poi apportare le seguenti modifiche al fine di ottenere una funzione asincrona-segnale-safe:

  • sostituire __fcntl con fcntl: necessaria per rendere il codice compilato
  • sostituire __set_errno(<errno-define>) con errno = <errno-define>: necessaria per rendere il codice compilare

  • sostituire la chiamata a memset() con assigments appropriate struct fcntl = {0}: necessarie per avere diventa async-signal-save.