semctl(2) changes permissions and other characteristics of a semaphore set. It must be called with a valid semaphore ID. The semnum value selects a semaphore within an array by its index. The cmd argument is one of the following control flags.
|
GETVAL |
Return the value of a single semaphore. |
|
SETVAL |
Set the value of a single semaphore. In this case, arg is taken as arg.val, an int. |
|
GETPID |
Return the PID of the process that performed the last operation on the semaphore or array. |
|
GETNCNT |
Return the number of processes waiting for the value of a semaphore to increase. |
|
GETZCNT |
Return the number of processes waiting for the value of a particular semaphore to reach zero. |
|
GETALL |
Return the values for all semaphores in a set. In this case, arg is taken as arg.array, a pointer to an array of unsigned shorts. |
|
SETALL |
Set values for all semaphores in a set. In this case, arg is taken as arg.array, a pointer to an array of unsigned shorts. |
|
IPC_STAT |
Return the status information from the control structure for the semaphore set and place it in the data structure pointed to by arg.buf, a pointer to a buffer of type semid_ds. |
|
IPC_SET |
Set the effective user and group identification and permissions. In this case, arg is taken as arg.buf. |
|
IPC_RMID |
Remove the specified semaphore set. |
A process must have an effective user identification of owner, creator, or superuser to perform an IPC_SET or IPC_RMID command. Read and write permission is required as for the other control commands.
The following code illustrates semctl(2):
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
...
register int i;
...
i = semctl(semid, semnum, cmd, arg);
if (i == -1) {
perror("semctl: semctl failed");
exit(1);
...