#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 |