2010-08-10 30 views
0

如果我沒有定義LINUX_ENV宏,一切順利(特別是,IPC_RMID cmd返回0)。 但是如果我定義了LINUX_ENV(我正在linux系統-ubuntu10.04上運行),最後一個semctl的IPC_RMID cmd返回EINVAL,並且說無效參數,即信號量未被刪除。 它似乎較早的semctl SEM_INFO cmd導致較晚的IPC_RMID cmd返回在Linux系統上的無效參數 我的代碼中哪裏出錯?任何人都可以幫助我這個。信號量相關 - smtctl使用IPC_RMID失敗,無效參數

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

//#define LINUX_ENV 

#ifdef LINUX_ENV 
#define _GNU_SOURCE 
#endif 

union semun{ 
    int val; 
    struct semid_ds *buf; 
    unsigned short int *array; 
    struct seminfo *__buf; 
}; 

int main(int argc,char* argv[]) 
{ 
    key_t key; 
    int semid; 
    int nsems; 
    int proj_id; 

    struct semid_ds semid_ds_buf; 
    union semun semun_buf; 
    struct seminfo* sem_info; 

    proj_id=rand(); 
    key=ftok(argv[0],proj_id); 
    nsems=2; 
    semid=semget(key,nsems,IPC_CREAT|IPC_EXCL|0666); 
    if(semid==-1) 
    { 
     perror("semget failed"); 
     return -1; 

    }else 
    { 
     printf("key(%s,%d) semaphore id:%d\n",argv[0],proj_id,semid); 
    } 
    semun_buf.buf=&semid_ds_buf; 
    //nsems is ignored 
    semctl(semid,0,IPC_STAT,&semid_ds_buf); 

    printf("current number of semaphores:%lu\n",semid_ds_buf.sem_nsems); 

#ifdef LINUX_ENV 
    if(semctl(semid,0,SEM_INFO,&semun_buf)==-1) 
    { 
     printf("semctl SEM_INFO failed"); 
     return -2; 
    } 

    sem_info=(struct seminfo*)(&semid_ds_buf); 
    printf("max entries in semaphore map:%d\n",sem_info->semmap); 

#endif 
    if(semctl(semid,0,IPC_RMID,0)==-1) 
    { 
     perror("semctl IPC-RMID failed"); 
     return -3; 
    } 
    return 0; 
} 

回答

1

的SEM_INFO調用返回seminfo結構,定義如下:

struct seminfo { 
    int semmap; /* # of entries in semaphore map; 
       unused */ 
    int semmni; /* Max. # of semaphore sets */ 
    int semmns; /* Max. # of semaphores in all 
       semaphore sets */ 
    int semmnu; /* System-wide max. # of undo 
       structures; unused */ 
    int semmsl; /* Max. # of semaphores in a set */ 
    int semopm; /* Max. # of operations for semop() */ 
    int semume; /* Max. # of undo entries per 
       process; unused */ 
    int semusz; /* size of struct sem_undo */ 
    int semvmx; /* Maximum semaphore value */ 
    int semaem; /* Max. value that can be recorded for 
       semaphore adjustment (SEM_UNDO) */ 
}; 

設置返回緩衝器上述結構並再次嘗試。希望能幫助到你。 (我不能使用RHEL5.4系統上,上面的代碼雖然重新您的問題)


+0

謝謝,我更換**如果(了semctl(semid的,0,SEM_INFO,與semun_buf)== - 1) **。與** if(semctl(semid,0,SEM_INFO,semun_buf)== - 1)**。但爲什麼不semctl抱怨? – schemacs 2010-08-10 12:28:12

+0

這是因爲您正在發送一個指向緩衝區的指針,該緩衝區被輸入到seminfo中。 semctl()無法知道您發送的緩衝區不足以包含返回數據,因此它會繼續並「損壞」堆棧,從而導致下一個semctl()調用行爲不正常。 – 2010-08-11 06:02:25

+0

謝謝。這是我的錯。 – schemacs 2010-08-12 14:18:54

相關問題