Я пытаюсь записать в разделяемую память, но по какой-то причине после вызова shmat() и strcpy я получаю ошибку сегментации (сбрасывание ядра), почему это так?shmat возвращает ошибку сегментации (core dumped)
Это мой код:
int fd,shmid;
key_t shmkey;
char *shm_add;
pid_t pid,pid1=0,pid2=0;
shmkey=ftok("shmdemo.c",'j');
if (shmkey == (key_t)-1)
{
printf("main: ftok() for shm failed\n");
return -1;
}
shmid=shmget(shmkey, 50, 0666 | IPC_CREAT | IPC_EXCL);
if (shmid == -1)
{
printf("main: shmget() failed\n");
return -1;
}
shm_add=(char *)shmat(shmid,0,0);
if (shm_add==NULL)
{
printf("main: shmat() failed\n");
return -1;
}
strcpy(shm_add,"hello");
редактировать: У меня есть имя файла shmdemo.c на каталог, а ERRNO из shmget сказать «Файл существует», но когда я удалить «shmdemo.c» из каталог, новое errno приходит в ftok, который говорит «Нет такого файла или каталога».
спасибо, Asaf.
Какая ценность 'shm_add'? (Или, как правило, проверьте возвращаемые значения всех системных вызовов, если они сообщают об успехе.) – millimoose
Хорошо, я добавил возврат для системных вызовов, проблема в shmget. Зачем? –
Ну, что [значение 'errno' после сбоя вызова] (http://linux.die.net/man/3/perror)? И, следовательно, что означает '' man shmget' '(http://linux.die.net/man/2/shmget), что означает значение errno? – millimoose