信号量:
互斥:P、V在同一个进程中。
进程A当进行P操作,信号量资源数减1,比如信号量资源个数设置为1,p操作后就会变0. 进程B再进行P操作,信号量资源数变为-1,开始阻塞该进程。进程A进行V操作,释放信号量资源+1,信号量资源数变为0.开始唤醒B进程。B进程执行结束后,执行V操作,释放信号量资源,此时会变为1.
#include "sem.h"
int sem_creat(int key)
{
int semid;
semid = semget(key,1,0666|IPC_CREAT);// 1表示信号量的个数
return semid;
}
int sem_open(int key)
{
int semid;
semid = semget(key,1,0666);
return semid;
}
int sem_set(int semid,int semnu)
{
union semun set_1;
int ret;
set_1.val = semnu; // 表示信号量的下标,即你开辟了这么多个信号量,你要用哪个呢?
ret = semctl(semid,0,SETVAL,set_1);
return ret;
}
int sem_get(int semid)
{
union semun set_1;
int ret;
ret = semctl(semid,0,GETVAL,set_1);
return set_1.val;
}
int set_p(int semid)
{
struct sembuf sops = {0,-1,0};// p 操作表示可用资源数减1
int ret = semop(semid,&sops,1);
return ret;
}
int set_v(int semid)
{
struct sembuf sops = {0,1,0};
int ret = semop(semid,&sops,1);// v 操作表示可用资源数加1
return ret;
}
int main()
{
int semid = sem_creat(0x1233);
int ret = sem_set(semid,1);
if(ret == -1)
{
printf("set value is error.....\n");
}
ret = sem_get(semid);
if(ret != -1)
printf("get value is %d \n",ret);
pid_t pid = fork();
set_p(semid);//
sleep(3);
printf("pid is %d \n\n",getpid());
set_v(semid);
}