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