Linuxc之訊號量集合
int main(int argc,char const *argv[])
{
int semid;
key_t key;
key=ftok("./tt",1);
semid=semget(key,2,IPC_CREAT|0666);
if(semid<0)
{
printf("semget error\n");
exit(1);
}
typedef union semnu{
int value;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *nbuf;
}sem;
sem sem0,sem1;
sem0.value=1;
sem1.value=3;
semctl(semid,0,SETVAL,sem0);
semctl(semid,1,SETVAL,sem1);
semctl(semid,0,GETVAL);
semctl(semid,1,GETVAL);
struct sembuf buf_p[2];
buf_p[0].sem_num = 0;
buf_p[0].sem_op =1;
buf_p[0].sem_flg = (IPC_NOWAIT|SEM_UNDO);
buf_p[1].sem_num = 1;
buf_p[1].sem_op = -1;
buf_p[1].sem_flg = (IPC_NOWAIT|SEM_UNDO);
int i=1;
while(1){
int val0,val1;
val0=semctl(semid,0,GETVAL);
val1=semctl(semid,1,GETVAL);
printf("第%d次\n",i);
i++;
printf("訊號量1=%d 訊號量2= %d\n\n",val0,val1);
if(val0==val1)
{
printf("訊號量1==訊號量2------結束退出\n");
break;
}
sleep(3);
semop(semid,buf_p,2);
}
return 0;
}