From db7499717fb772d5bc72705d4c9784b790d4e586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=AE=89?= Date: Wed, 2 Dec 2015 09:38:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86IPC=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=93=8D=E4=BD=9C=EF=BC=8C=E5=8C=85=E6=8B=AC=EF=BC=9A?= =?UTF-8?q?PV=E5=8E=9F=E8=AF=AD=E6=93=8D=E4=BD=9C=E4=BB=A5=E5=8F=8AIPC?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E8=8E=B7=E5=8F=96=E6=93=8D=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sys_nicmonitor/mnic.c | 18 ++++++++++-------- src/sys_nicmonitor/nicinfo_shm.c | 14 +++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/sys_nicmonitor/mnic.c b/src/sys_nicmonitor/mnic.c index 8ad839b..a4fd8f3 100644 --- a/src/sys_nicmonitor/mnic.c +++ b/src/sys_nicmonitor/mnic.c @@ -330,12 +330,12 @@ static void init_sem(int *semid, CONFIG_FILE_ST *ptr) key = 0x1d5200; #endif - if((*semid = semget(key, 1, IPC_CREAT|0666)) == -1){ + if((*semid = semget(key, 1, IPC_CREAT|IPC_EXCL|0666)) == -1){ snprintf(error_str, sizeof(error_str), "EMERG: semget():%s\n", strerror(errno)); record_log(error_str); return; } - if(semctl(*semid, 0, SETVAL, 0) == -1){ + if(semctl(*semid, 0, SETVAL, 1) == -1){ snprintf(error_str, sizeof(error_str), "EMERG: semctl: %s !\n", strerror(errno)); record_log(error_str); semctl(*semid, 0, IPC_RMID); @@ -389,7 +389,7 @@ static void init_shm(SHM **ptr, CONFIG_FILE_ST *p) record_log(error_str); #endif - global_share_id = shmget( share_key, size, IPC_CREAT|0666 ); + global_share_id = shmget( share_key, size, IPC_CREAT|IPC_EXCL|0666 ); if( global_share_id == -1 ) { snprintf( error_str, sizeof( error_str ), "EMERG: fail shmget, %s, 0x%x\n", strerror(errno), share_key); @@ -428,14 +428,14 @@ static void get_sem(int semid) char error_str[200]; lock[0].sem_num = 0; - lock[0].sem_op = 0; + lock[0].sem_op = -1; lock[0].sem_flg = SEM_UNDO; - lock[1].sem_num = 0; + /*lock[1].sem_num = 0; lock[1].sem_op = 1; - lock[1].sem_flg = SEM_UNDO; + lock[1].sem_flg = SEM_UNDO;*/ - while(semop(semid, lock, 2)){ + while(semop(semid, lock, 1)){ if(errno == EINTR)continue; snprintf(error_str, sizeof(error_str), "EMERG: get_sem semop():%s\n", strerror(errno)); record_log(error_str); @@ -450,7 +450,7 @@ static void release_sem(int semid) struct sembuf unlock; unlock.sem_num = 0; - unlock.sem_op = -1; + unlock.sem_op = 1; unlock.sem_flg = SEM_UNDO; if((ret = semop(semid, &unlock, 1)) == -1){ @@ -1074,6 +1074,8 @@ void sig_handler(int sig) // snprintf(err_str, sizeof(err_str), "NOTICE: process exit by signal %d\n", sig); // record_log(err_str); + semctl(semid,0,IPC_RMID,0); + shmctl(global_share_id,IPC_RMID,NULL); exit(0); } diff --git a/src/sys_nicmonitor/nicinfo_shm.c b/src/sys_nicmonitor/nicinfo_shm.c index 9860ce9..3f83988 100644 --- a/src/sys_nicmonitor/nicinfo_shm.c +++ b/src/sys_nicmonitor/nicinfo_shm.c @@ -142,14 +142,14 @@ void get_sem(int semid) struct sembuf lock[2]; lock[0].sem_num = 0; - lock[0].sem_op = 0; + lock[0].sem_op = -1; lock[0].sem_flg = SEM_UNDO; - lock[1].sem_num = 0; +/* lock[1].sem_num = 0; lock[1].sem_op = 1; - lock[1].sem_flg = SEM_UNDO; + lock[1].sem_flg = SEM_UNDO;*/ - while(semop(semid, lock, 2)){ + while(semop(semid, lock, 1)){ if (errno == EINTR) { continue; } @@ -166,7 +166,7 @@ void release_sem(int semid) struct sembuf unlock; unlock.sem_num = 0; - unlock.sem_op = -1; + unlock.sem_op = 1; unlock.sem_flg = SEM_UNDO; if((ret = semop(semid, &unlock, 1)) == -1){ @@ -195,7 +195,7 @@ int init_nic_info(void) #else key = 0x1d5200; #endif - if((semid = semget(key, 1, IPC_CREAT|0666)) == -1){ + if((semid = semget(key, 1, 0666)) == -1){ snprintf(err_str, sizeof(err_str), "EMERG: Create semaphore error: %s\n", strerror(errno)); record_log(err_str); return -1; @@ -251,7 +251,7 @@ int init_nic_info(void) record_log(err_str); #endif - global_share_id = shmget( share_key, size, IPC_CREAT|0666 ); + global_share_id = shmget( share_key, size, 0666 ); if( global_share_id == -1 ) { snprintf( err_str, sizeof( err_str ), "EMERG: fail shmget, %s, 0x%x\n", strerror(errno), share_key);