一 看如下代码,有若干需要注意的地方
14 int CreateSem(key_t key,int value)
15 {
16 union semun sem;
17 sem_t semid;
18 sem.val=value;
19
20 semid=semget(key,1,IPC_CREAT|0666);
21 if(semid==-1)
22 {
23 perror("semget error");
24 return -1;
25 }
26 semctl(semid,0,SETVAL,sem);
27 return semid;
28 }
int semget(key_t key,int nsems,int flag)
1)semget若指定IPC_CREAT,则nsems参数不能为02)新创建的信号量,其value是不确定的,在linux下是0。
3)使用时一般需自定义的结构:union semun(信号量),struct msgbuf (信息队列,根据需要)
55 void DestroySem(sem_t semid)
56 {
57 union semun sem;
58 sem.val=0;
59 semctl(semid,0,IPC_RMID,sem);
60 }
int semctl(int semid,int semum,int cmd)
5)删除信号量时(IPC_RMID),最后的参数sem是忽略的,所以sem可取任意值,消息队列类似。