IPC 信号量(semaphore)

来源:互联网 发布:淘宝最靠谱的aj店 编辑:程序博客网 时间:2024/06/11 06:54

实现原理,是通过信号量的PV操作来实现进程之间的切换
typedef union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}SEMUN;
/初始化/
int init_sem(int id,int init_val)
{
SEMUN un;
un.val = init_val;
int ret = semctl(id,0,SETVAL,un);
}
/P操作/
int sem_P(int id)
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
int ret = semop(id,&buf,1);
if(-1 == ret)
{
perror(“P”);
exit(1);
}
return ret;
}
/V操作/
int sem_V(int id)
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = +1;
buf.sem_flg = SEM_UNDO;
int ret = semop(id,&buf,1);
if(-1 == ret)
{
perror(“v”);
exit(1);
}
return ret;
}
int main(int argc, const char *argv[])
{
key_t key = ftok(“./”,’!’);//key值可以通过三种方法获得。
if(-1 == key )
{
perror(“ftok”);
exit(1);
}
int shmid = shmget(key,4096,IPC_CREAT|0666);
if(-1 == shmid)
{
perror(“shmget”);
exit(1);
}
void* p = shmat(shmid,NULL,0);
if((void*)-1 == p)//唯一一个指针的返回值不为NULL的。
{
perror(“shmat”);
exit(1);
}
int semid = semget(key,1,IPC_CREAT|0666);
if(-1== semid)//相当于有个小名
{
perror(“semget”);
exit(1);
}
init_sem(semid,1);
int i = 10;
sem_P(semid);
while(i–)
{
(int )p = i;
printf(“%d\n”,i);
sleep(1);
}
sem_V(semid);
shmdt(p);
return 0;
}