2015-11-08 4 views
-1

Я использую shared_memory с использованием POSIX ..использованием памяти больше, чем выделено Linux с

Я выделил 4KB, но я могу использовать намного больше, чем 4KB ... это дает мне ошибку сегментации, когда я пишу более 10350 символов в памяти. который равен ~ 10350 байт/1024 = ~ 10 КБ?

Я считаю, что операционная система должна охранять память за такое нарушение, но это позволяет мне? Зачем ?

Производитель Source-код, который используется, чтобы поместить что-то в сегмент разделяемой памяти

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
int main(void) 
{ 
const int size = 4096; //4kb 
const char *name = "os"; 
const char *message = "Put more than 5000 chars it will work perfectly but less than 10350 or something like that"; 
int shm_fd; 
void *ptr; 
shm_fd = shm_open(name,O_CREAT | O_RDWR,0666); 
ftruncate(shm_fd,size);// set the size to 4kb 
ptr = mmap(0,size,PROT_WRITE | PROT_READ,MAP_SHARED,shm_fd,0); 
sprintf(ptr,"%s",message); 
ptr += strlen(message); 
return 0; 
+4

Если ваш вопрос: «Почему я могу писать за пределы выделенной мной памяти?», Тогда ответ будет «неопределенным поведением». –

+0

Вы запрашиваете среду времени выполнения, которая управляет памятью для вас и не позволяет использовать несанкционированную память? Другие языки делают это, а не C. C позволяет вам стрелять в ногу. –

+1

неопределенное поведение! он не ответил на мой вопрос. Мне нужно знать, почему это неопределенное поведение происходит? –

ответ

1

Моя система имеет по 4Kb страниц размеров тоже, и мой по умолчанию размер стека 8KiB. Если я:

#define _BSD_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
#include <unistd.h> 
int main(){ 
    const int size = 4096; 
    const char *name = "os"; 
    int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 
    ftruncate(shm_fd,size);// set the size to 4kb 
    char* ptr = (char*)mmap(0,size,PROT_WRITE | PROT_READ,MAP_SHARED,shm_fd,0); 
    for(int i=0; i>=0; i++){ 
    printf("%d\n", i); 
    ptr[i]='x'; 
    } 
    return 0; 
} 

Это будет детерминировано в 12KiB сегментации (12288). Я думаю, что mmaps в начале вашего heap пространства, которое находится рядом с стеком (8KiB) и переполнено 4KiB, приводит к разгрому пространства стека, после чего оно исчезает.

+0

так что делать это очень опасно .. я имею в виду, если бы были данные в куче .. все будет утеряно. Это означает, что BAD могут быть очень плохие результаты? так что это неопределенное поведение? –

+0

Это неопределенное поведение с точки зрения стандарта языка C - разные системы могут делать разные вещи. – PSkocik

+1

Спасибо :) ты мне очень помог –

Смежные вопросы