Create or access a named semaphore
#include <semaphore.h> sem_t * sem_open( const char * sem_name, int oflags, ... );
Don't set oflags to O_RDONLY, O_RDWR, or O_WRONLY. A semaphore's behavior is undefined with these flags. The QNX libraries silently ignore these options, but they may reduce your code's portability. |
For more information, see below.
If you set O_CREAT in oflags, you must also pass the following arguments:
For more information, see “Access permissions” in the documentation for stat().
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The sem_open() function creates or accesses a named semaphore. Named semaphores are slower than the unnamed semaphores created with sem_init(). Semaphores persist as long as the system is up.
If you want to use named semaphores, the named-semaphore manager must be running. Starting with release 6.3.0, procnto manages named semaphores directly, which mqueue used to do (and still does, if it detects that procnto isn't doing so). |
The sem_open() function returns a semaphore descriptor that you can use with sem_wait(), sem_trywait(), and sem_post(). You can use it until you call sem_close(). You can unlink the semaphore by calling sem_unlink(); when all processes have unlinked the semaphore, it's destroyed.
Named semaphores are always created under /dev/sem:
In either case, slash characters other than the leading slash character aren't interpreted, and the specified name, including these slash characters, is used to identify the semaphore. In other words, additional slashes don't create a directory structure under /dev/sem.
For example, if your current directory is /tmp:
name | Pathname space entry |
---|---|
/my_sem | /dev/sem/my_sem |
my_sem | /dev/sem/tmp/my_sem |
If you want to create or access a semaphore on another node, specify the name as /net/node/sem_location. |
The oflags argument is used only for semaphore creation. When creating a new semaphore, you can set oflags to O_CREAT or (O_CREAT|O_EXCL):
Don't mix named semaphore operations (sem_open() and sem_close()) with unnamed semaphore operations (sem_init() and sem_destroy()) on the same semaphore. |
A pointer to the created or accessed semaphore, or SEM_FAILED for failure (errno is set).
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
sem_close(), sem_destroy(), sem_init(), sem_post(), sem_trywait(), sem_unlink(), sem_wait()
mqueue, procnto* in the Utilities Reference