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;
}
謝謝,我更換**如果(了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
這是因爲您正在發送一個指向緩衝區的指針,該緩衝區被輸入到seminfo中。 semctl()無法知道您發送的緩衝區不足以包含返回數據,因此它會繼續並「損壞」堆棧,從而導致下一個semctl()調用行爲不正常。 – 2010-08-11 06:02:25
謝謝。這是我的錯。 – schemacs 2010-08-12 14:18:54