#include <sys/types.h>
|
#include <sys/ipc.h>
|
#include <sys/sem.h>
|
int
semop (int semid, struct sembuf *array, size_t nops); |
struct sembuf { u_short sem_num; /* semaphore # */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ };
For each element in array, sem_op and sem_flg determine an operation to be performed on semaphore number sem_num in the set. The values SEM_UNDO and IPC_NOWAIT may be OR ’ed into the sem_flg member in order to modify the behavior of the given operation.
The operation performed depends as follows on the value of sem_op:
A negative value for sem_op generally means that a process is waiting for a resource to become available.
For each semaphore a process has in use, an "adjust on exit" value is maintained, as alluded to earlier. When a process exits, either voluntarily or involuntarily, the adjust on exit value for each semaphore is added to the semaphore’s value. This can be used to insure that a resource is released if a process terminates unexpectedly.
#include <sys/ipc.h> #include <sys/sem.h> #include <stdio.h> void File_Update(char* path, int val) { struct sembuf sem_op; FILE* fp; /* * Wait on the semaphore till the value is non-negative. */ sem_op.sem_num = 0; sem_op.sem_op = -1; sem_op.sem_flg = 0; semop(sem_set_id, &sem_op, 1); /* * If we are here, then We have locked the semaphore, * and are assured exclusive access to file. * We can now manipulate the file */ fp = fopen(path, "w"); if (fp) { fprintf(fp, "%d\n", val); fclose(fp); } /* * Increase the value of the semaphore by 1 so that others blocked on * this semaphore get awakened. */ sem_op.sem_num = 0; sem_op.sem_op = 1; sem_op.sem_flg = 0; semop(sem_set_id, &sem_op, 1); }
[EINVAL] | |
No semaphore set corresponds to semid, or the process would exceed the system-defined limit for the number of per-process SEM_UNDO structures. | |
[EACCES] | |
Permission denied due to mismatch between operation and mode of semaphore set. | |
[EAGAIN] | |
The semaphore’s value would have resulted in the process being put to sleep and IPC_NOWAIT was specified. | |
[E2BIG] | |
Too many operations were specified. [SEMOPM] | |
[EFBIG] | |
sem_num was not in the range of valid semaphores for the set. | |
[EIDRM] | |
The semaphore set was removed from the system. | |
[ENOSPC] | |
The system SEM_UNDO pool [SEMMNU] is full. | |
[ERANGE] | |
The requested operation would cause either the semaphore’s current value [SEMVMX] or its adjust on exit value [SEMAEM] to exceed the system-imposed limits. | |
© 2005-2007 Nokia |