5.2.1 Allocation and Deallocation
调用semget和semctl来生成和销毁进程信号灯
int semget(key_t key, int nsems, int semflg);
key 用于指定一组信号灯集
nsems 生成信号灯的数目
semflg 权限
可以利用semget得到已存在的信号灯,这个时候nsems可以为0。
int semctl(int semid, int semnum, int cmd, ...);
semid 信号灯集标示
semnum 信号灯的数目
cmd 为IPC_RMID时将销毁信号灯
第四个参数为union semun类型,但是并不起作用
销毁信号灯后,该信号灯会被从内存中删除
5.2.2 初始化信号灯/Initializing Semaphores
利用semctl给信号灯集初始化时,传入0作为第二个参数,SETALL作为第三个参数,并给第四个参数union semun的array字段指向一unsigned short数组,其中数组中的每个值都对应赋给信号灯集的每个信号灯的值。
5.2.3 Wait and Post Operations
int semop(int semid, struct sembuf *sops, unsigned nsops);
semid 信号灯集标示
sops 操作集
nsops 操作集的数目
struct sembuf {
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
}
其中sem_op为正数时,则立即将信号的灯值加上该数。
如果sem_op为负数时,则会从信号德灯值中减去该数的{jd1}值,如果该操作过后信号量变为负数了,便会将进程挂起,直到信号灯的值大于等于sem_op的{jd1}值。
如果sem_op为0,则会将进程挂起,直到信号灯的值变为0。
sem_flg 为IPC_NOWAIT时,则会保证进程不会被挂起,如果semop操作会引起阻塞,则semop返回失败。
如果sem_flg为SEM_UNDO时,那么在进程结束时,相应的操作将被取消。如果设置了该标志位,那么该操作将会在进程退出的时候回滚回去。
5.2.4 调试信号灯/Debugging Semaphores
ipcs -s 显式已存在的信号灯
ipcrm sem 删除信号灯
调用semget和semctl来生成和销毁进程信号灯
int semget(key_t key, int nsems, int semflg);
key 用于指定一组信号灯集
nsems 生成信号灯的数目
semflg 权限
可以利用semget得到已存在的信号灯,这个时候nsems可以为0。
int semctl(int semid, int semnum, int cmd, ...);
semid 信号灯集标示
semnum 信号灯的数目
cmd 为IPC_RMID时将销毁信号灯
第四个参数为union semun类型,但是并不起作用
销毁信号灯后,该信号灯会被从内存中删除
5.2.2 初始化信号灯/Initializing Semaphores
利用semctl给信号灯集初始化时,传入0作为第二个参数,SETALL作为第三个参数,并给第四个参数union semun的array字段指向一unsigned short数组,其中数组中的每个值都对应赋给信号灯集的每个信号灯的值。
5.2.3 Wait and Post Operations
int semop(int semid, struct sembuf *sops, unsigned nsops);
semid 信号灯集标示
sops 操作集
nsops 操作集的数目
struct sembuf {
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
}
其中sem_op为正数时,则立即将信号的灯值加上该数。
如果sem_op为负数时,则会从信号德灯值中减去该数的{jd1}值,如果该操作过后信号量变为负数了,便会将进程挂起,直到信号灯的值大于等于sem_op的{jd1}值。
如果sem_op为0,则会将进程挂起,直到信号灯的值变为0。
sem_flg 为IPC_NOWAIT时,则会保证进程不会被挂起,如果semop操作会引起阻塞,则semop返回失败。
如果sem_flg为SEM_UNDO时,那么在进程结束时,相应的操作将被取消。如果设置了该标志位,那么该操作将会在进程退出的时候回滚回去。
5.2.4 调试信号灯/Debugging Semaphores
ipcs -s 显式已存在的信号灯
ipcrm sem 删除信号灯