server.c
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <time.h>
#define TIME_SEM_KEY 500
union semun { int val ; struct semid_ds *buf ; ushort *array; };
int semset_id; /* global for cleanup() */
main()
{
union semun initval;
struct sembuf actions; /* action set */
int i ;
semset_id = semget( TIME_SEM_KEY, 1, (0666|IPC_CREAT|IPC_EXCL) );
//1表示创建一个信号量
//IPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。
//IPC_EXCL只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。
initval.val = 1;
semctl(semset_id, 0, SETVAL, initval); //0表示信号量集合里面的特定信号量的号码,从0开始
//SETVAL 表示给信号量设置初始值,即initval.val
printf(“server begin\n”);
printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
actions.sem_num = 0;
actions.sem_flg = SEM_UNDO; //使用SEM_UNDO的作用是,-1后加锁,如果程序意外退出,系统则会恢复此信号量 //,否则其他进程将一直阻塞在这个被锁的信号量这里。
actions.sem_op = -1 ;
semop( semset_id, &actions, 1); //-1操作后,信号量变为0
printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
for(i=0; i < 5; i++)
{
printf(“server sleep %d\n”, i);
printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
sleep(i); //这时候启动client进程,client进程获得不到信号量,被阻塞
}
actions.sem_num = 0;
actions.sem_flg = SEM_UNDO;
actions.sem_op = +1 ;
semop( semset_id, &actions, 1);
sleep(2); //这时候client进程才获得了信号量
printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
semctl(semset_id, 0, IPC_RMID, initval);
}
client.c
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <time.h>
#define TIME_SEM_KEY 500
union semun { int val ; struct semid_ds *buf ; ushort *array; };
int seg_id, semset_id; /* global for cleanup() */
main()
{