Use flock() in the sigaction handler
Asked Answered
T

1

5

flock() is generally async-signal-safe because it is a system call. Its semantics make it hard to implement it differently. It is not in the POSIX's list of async-signal-safe functions because it is not in POSIX at all.

Is it possible to use flock() in the sigaction handler without problems?

Tideland answered 7/6, 2013 at 7:59 Comment(5)
The Mac OS X documentation for flock() doesn't give any direct help. There's no reason to suppose flock() messes with user-space structures, so there's every reason to think it will be async-signal-safe, but that's not conclusive. The fcntl() function, which is the POSIX locking system call, is async-signal-safe, which supports the view that flock() can be implemented so it is async-signal-safe, but that's still not proof. Maybe you should upgrade to use fcntl() instead, and then you'll know you're safe.Hailey
@JonathanLeffler Cna I use flock() to lock and fcntl() to unlock?Tideland
Please see my addtional answer to your initial question here: https://mcmap.net/q/1329159/-quot-kill-15-quot-triggers-the-sigaction-code-but-does-not-terminate-my-c-programStrafford
No: you can't use fcntl() to unlock what you locked with flock().Hailey
Finally I get an answer in this topic: #16988756Tideland
T
0

According to @alk answer in the following topic:

We can develop our property flock() function (its name could be async_flock()). we copy in this new function the content of the origin lockf() code and then we make the following changes in order to get an async-signal-safe function:

  • replace __fcntl with fcntl: necessary to make the code compile
  • replace __set_errno(<errno-define>) with errno = <errno-define>: necessary to make the code compile

  • replace the call to memset() with appropriate assigments struct fcntl = {0}: necessary to have it become async-signal-save.

Tideland answered 7/6, 2013 at 17:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.