进程间通信之: 信号量
3.使用实例
本实例说明信号量的概念以及基本用法。在实例程序中,首先创建一个子进程,接下来使用信号量来控制两个进程(父子进程)之间的执行顺序。
因为信号量相关的函数调用接口比较复杂,我们可以将它们封装成二维单个信号量的几个基本函数。它们分别为信号量初始化函数(或者信号量赋值函数)init_sem()、P操作函数sem_p()、V操作函数sem_v()以及删除信号量的函数del_sem()等,具体实现如下所示:
/*sem_com.c*/
#includesem_com.h
/*信号量初始化(赋值)函数*/
intinit_sem(intsem_id,intinit_value)
{
unionsemunsem_union;
sem_union.val=init_value;/*init_value为初始值*/
if(semctl(sem_id,0,SETVAL,sem_union)==-1)
{
perror(Initializesemaphore);
return-1;
}
return0;
}
/*从系统中删除信号量的函数*/
intdel_sem(intsem_id)
{
unionsemunsem_union;
if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
{
perror(Deletesemaphore);
return-1;
}
}
/*P操作函数*/
intsem_p(intsem_id)
{
structsembufsem_b;
sem_b.sem_num=0;/*单个信号量的编号应该为0*/
sem_b.sem_op=-1;/*表示P操作*/
sem_b.sem_flg=SEM_UNDO;/*系统自动释放将会在系统中残留的信号量*/
if(semop(sem_id,sem_b,1)==-1)
{
perror(Poperation);
return-1;
}
return0;
}
/*V操作函数*/
intsem_v(intsem_id)
{
structsembufsem_b;
sem_b.sem_num=0;/*单个信号量的编号应该为0*/
sem_b.sem_op=1;/*表示V操作*/
sem_b.sem_flg=SEM_UNDO;/*系统自动释放将会在系统中残留的信号量*/
if(semop(sem_id,sem_b,1)==-1)
{
perror(Voperation);
return-1;
}
return0;
}
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码