У меня есть этот код:shmctl выбрасывает «не может выделить память» в C
#define SHMSIZE 8388606
int main()
{
int shmid;
void *shmPtr;
char *shm;
if ((shmid = shmget(IPC_PRIVATE, sizeof(char) * SHMSIZE , IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
if ((shmPtr = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
shm = (char *)shmPtr;
strncpy(shm, "0\n", 2);
struct shmid_ds shmid_ds;
int rtrn = shmctl(shmid, SHM_LOCK, &shmid_ds);
if(rtrn < 0) {
perror("shmctl");
exit(1);
}
else {
printf("Nailed it\n");
}
return 0;
}
Бег, я получаю ошибку:
shmctl: Cannot allocate memory
Определение меньшее значение для SHMSIZE исправляет ошибку, но что Мне показалось странным, что эта ошибка возникает в части «shmctl». Мои рассуждения говорят мне, что эта ошибка должна быть выбрана в части «shmget».
Как этот код успешно работает через вызов shmget()? Я пропустил что-то важное?
Я рекомендую вам [читать shmctl' страницу 'вручную] (HTTP: // man7 .org/linux/man-pages/man2/shmctl.2.html), и что он говорит об ошибке «ENOMEM». –
'struct shmid_ds shmid_ds;' не инициализируется. – wildplasser