2013-06-07 11 views
5

flock() ist generell async-signalsicher, da es sich um einen Systemaufruf handelt. Seine Semantik macht es schwierig, es anders zu implementieren. Es ist nicht in den POSIX list async-Signal-sicheren Funktionen, weil es überhaupt nicht in POSIX ist.Verwenden Sie flock() im sigaction-Handler

Ist es möglich, flock() im sigaction Handler ohne Probleme zu verwenden?

+1

Die Mac OS X-Dokumentation für 'flock()' gibt keine direkte Hilfe. Es gibt keinen Grund zu der Annahme, dass 'flock()' mit User-Space-Strukturen verwechselt wird, also gibt es allen Grund anzunehmen, dass es async-signalsicher sein wird, aber das ist nicht schlüssig. Die 'fcntl()' -Funktion, die den POSIX-Schließsystemaufruf darstellt, ist async-signalsicher, was die Ansicht unterstützt, dass 'flock()' so implementiert werden kann, dass sie async-signalsicher ist, aber das ist immer noch kein Beweis . Vielleicht sollten Sie ein Upgrade durchführen, um stattdessen 'fcntl()' zu verwenden, und dann wissen Sie, dass Sie in Sicherheit sind. –

+0

@ JonathanLeffler Cna Ich benutze 'flock()' zu sperren und 'fcntl()' zu entsperren? – MOHAMED

+0

Bitte sehen Sie meine zusätzliche Antwort auf Ihre erste Frage hier: http://Stackoverflow.com/a/16979601/694576 – alk

Antwort

0

Nach @alk Antwort auf folgende topic:

Wir unser Eigentum flock() Funktion entwickeln kann (der Name async_flock() sein könnte). kopieren wir in dieser neuen Funktion den Inhalt des Ursprungs lockf() Code und dann machen wir die folgenden Änderungen, um ein Asynchron-Signal-Safe-Funktion zu erhalten:

  • ersetzen __fcntl mit fcntl: notwendig, um den Code zu machen kompilieren
  • ersetzen __set_errno(<errno-define>) mit errno = <errno-define>: notwendig, den Code zu kompilieren machen

  • den Anruf zu memset() mit entsprechenden assigments ersetzen struct fcntl = {0}: notwendig, um es Asynchron-Signal-save werden muß.

Verwandte Themen