У меня странная проблема с общей памятью.
Метод shmget
возвращает -1, а errno
устанавливается на EEXIST
. По словам человека, это возможно только тогда, когда указаны оба флага IPC_EXCL
и IPC_CREAT
.
Мой код:
int main()
{
int shmid = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660);
int shmid2 = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660 );
if(shmid == -1)
{
if(errno == EEXIST)
perror("Error");
return -1;
}
if(shmid2 == -1)
{
if(errno == EEXIST)
perror("Error2");
return -1;
}
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
Он компилируется с -Wall без предупреждений, я проверяю с помощью ipcs, если сегмент уже присутствует (и удаляю его при необходимости). Выход Error2: File exists
.
Это работает, когда я меняю второй shmget на:
int shmid2 = shmget(0xABCD, MAX_SIZE, 0 );
Цитата из man shmget
:
EEXIST IPC_CREAT | IPC_EXCL was specified and the segment exists.
И еще один вопрос: правда ли, что mode_flags (то есть 0x660) не используются при попытке выполнить shmget?