- 论坛徽章:
- 0
|
/*生成信号量 */
int CreateSem()
{
key_t key;
char path[80];
memset( path, 0, sizeof( path ));
sprintf( path, "%s/%s", getenv("HOME" ), SERVER_FILE_NAME);
MainLog(ERR_LVL, " path [%s]", path );
key =ftok(path,SHM_HOST_SERVER);
MainLog(ERR_LVL, " key [%x]", key );
semid=semget(key,1,IPC_CREAT|0666); /*生成1个信号量*/
if (semid == -1 ){
MainLog(ERR_LVL," create semaphore error\n" );
exit(-1);
}
MainLog(ERR_LVL,"semid [%d]",semid);
/*初始化信号量*/
semctrl_arg.val = PROCNUM;
if( semctl(semid,0,SETVAL,semctrl_arg) < 0 ) /*为这个信号量元素赋初值1(PROCNUM)*/
{
MainLog(ERR_LVL, "semctl failed \n" );
return -1;
}
return 0;
}
/* p 操作 */
int DecreaseSem()
{
if( semop( semid, &decrease,1 ) < 0 )
{
/* MainLog(ERR_LVL," process [%d] p operation failed \n", getpid());*/
return -1;
}
return 0;
}
/* v 操作 */
int IncreaseSem()
{
if(semop(semid,&increase,1) < 0)
{
/* MainLog(ERR_LVL," process [%d] v operation failed \n", getpid() ); */
return -1;
}
return 0;
}
/*删除信号量*/
int DelSem()
{
if(semctl(semid,0,IPC_RMID,0) < 0 ){
MainLog(ERR_LVL,"delete sem failed!");
return -1;
}
return 0;
}
//具体调用:
while(1){
if(DecreaseSem()){
if (errno == EAGAIN)
continue;
exit(0);
}
/*这段是资源的判断,里面取数据库的某条未处理的记录*/
IncreaseSem();
if(haveunsettled){//存在未处理的记录
//处理.....
}
}
exit(0);
}
}
/*等待所有子进程结束后返回*/
while(wait(NULL) != -1);
DelSem(); |
|