Это я ожидал два файла для обмена памятью, один из них записывает данные для обмена памятью, другой - данные из общей памяти и данных printf ; но есть что-то заблуждение.Ошибка памяти: shmat return NULL, errno (22: Недопустимый аргумент) в CentOS6.8
shm_w.c
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,IPC_CREAT | 0666);
printf("shmid is = %d,pid=%d\n",shmid,getpid());
mem=shmat(shmid,(const void*)0,0);
if((int)mem==-1)
{
printf("attach faile.\n");
}
strcpy((char*)mem,"Hello,this is test memory.\n");
ret=shmdt(mem);
return 0;
}
shm_r.c
#include <errno.h>
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,0);
mem=shmat(shmid,(const void*)0,0);
//printf("%s\n",(char*)mem);
if(mem==(void*)-1)
{
fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",errno,strerror(errno));
return 2;
}
printf("%s\n",(char*)mem);
shmdt(mem);
return 0;
}
Когда я в CentOS6.8 компиляции двух .c файлов, в первый раз, это нормально.
К сожалению, с этого момента, я Рунический she_w.c был прав тоже:
Шмид является = 65537, PID = 7116.
, но когда я бегу shm_r.c, это появляется ошибка:
shmat return NULL ,errno(22:Invalid argument)
, так что я не знаю, что случилось это? Я пытаюсь его решить, например, использовал ipcs -m, но не отображал shmid. И я кошка/proc/7116/maps: «Нет такого файла или каталога»
кто может сказать мне, что произойдет? И как я могу найти Шмид в CentOS6.6
uname -r:
2.6.32-504.12.2.el6.x86_64
Я также использую кошку/ргос/sysvipc/ГИМ | grep 65537, но не появляется shmid. Не повезло!
Скажите, пожалуйста, как решить проблему, если вы знаете, спасибо!
'(сопзЬ пустота *) 0 '- используйте' NULL' макрос, чтобы получить _null указатель constant_. – Olaf
Вы управляете этими двумя программами один за другим? Как вы думаете, что произойдет, когда первая программа отделит сегмент памяти до запуска другой программы? Вам нужно дождаться запуска другой программы, прежде чем вы сможете отсоединить сегмент. –
«Вы запускаете эти две программы один за другим? Как вы думаете, что произойдет, когда первая программа отделит сегмент памяти до запуска другой программы? Вам нужно дождаться запуска другой программы, прежде чем вы сможете отсоединить сегмент. " Почему необходимо отключить после чтения программу и не может отсоединиться при записи программы? Я имею в виду, что запись данных записи записи завершена, она может отсоединиться, я не знаю, почему, когда запись программы завершена, можно использовать отсоединение. если я использовал отсоединенный в программе записи, общий объем памяти будет свободен, поэтому программа чтения не сможет читать данные? – Marcos