????? ????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????μ???????????????С??????????????????????????????????????????????????????????????? ?????????????????Э??????????????????????й?????????????????????
?????? ?????????????
????????????????????????????????????????P(sv)??V(sv)???????????????????
????P(sv)?????sv???????????????1?????????????????y???????
????V(sv)???????????????????sv??????????????????У??????н???????sv????????????1.
?????????????? ????????????????sv?????????????????????P(sv)?????????????????????????????????????sv??1????????????????????????????????? ??????????P(sv)???sv?0???????????????????????????????????V(sv)?????????????????????????????С?
?????? Linux???????????
????Linux??????????????????????????????в???????????????????????????????潫?????Щ???????н?????????????Щ???????????????????????????в????????????????????sys/sem.h?С?
?????? ????????????????
?????????????????????????????semid_ds??
????struct semid_ds {
????struct ipc_permsem_perm ;
????structsem* sem_base ; //??????????
????ushort sem_nsem ; //???????????
????time_t sem_otime ; //?????semop???
????time_t sem_ctime ; //????δ??????
????} ;
????????????????????????????????????????г???? ??????????????????
????struct {
????ushort_t semval ; //????????
????short sempid ; //?????????semop?????ID
????ushort semncnt ; //?????????????????????????????н????????? ???????
????ushort semzcnt ; //???????????????0???????
????} ;
?????? ??????????
????1???????????
????semget?????????????????????????????????????????
????#include <sys/sem.h>
????int semget (key_t key?? int nsem?? int oflag) ;
???????????????????????????????????semop??semctl?????????????
????????nsem????????е????????????????????????????????????????ò???????0??
????????oflag??????SEM_R(read)??SEM_A(alter)????????????????????????????IPC_CREAT??IPC_EXCL ;
????2?????????
???????semget????????????????????????????????????????semop(op--operate)????????С?
????#include <sys/sem.h>
????int semop (int semid?? struct sembuf * opsptr?? size_t nops) ;
????????opsptr????????????????????????????飬???????????sembuf???????
????struct sembuf{
????short sem_num; // ????????????????????????0
????short sem_op; // ?????????β??????????????????????????????
????// ?????-1????P??????????????????+1????V??????????????
????short sem_flg; // ????SEM_UNDO????????????????????????????????????????????
????// ??????????????
????};
?????????nops?漲opsptr??????????????
????sem_op???
??????1????sem_op????????????????????????????sem_op?????????????????V??????
??????2????sem_op?????????????????????????????????????????sem_op???????P??????
??????3????sem_op?0?????????y??????????????????????0
???????????????С??sem_op???????????????????????
??????1?????????IPC_NOWAIT????semop()???????EAGAIN??
??????2????δ???IPC_NOWAIT???????????semncnt???1????????y?????? ?????????????????y???????????????????????????????sem_op?????????????????????????????EIDRM???????????????? ???????????????????????EINTR????????????е??????????? ???????