高级linux编程学习- 5.2 进程信号灯/Processes Semaphores
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  删除信号灯
郑重声明:资讯 【高级linux编程学习- 5.2 进程信号灯/Processes Semaphores】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——