使用的内存超过分配的 linux c
using memory more than allocated linux c
我正在使用 shared_memory 使用 POSIX..
我已经分配了 4KB,但我可以使用超过 4KB 的空间...当我将超过 ~10350 个字符写入内存时,它会给我一个分段错误。等于 ~10350 字节 / 1024 = ~10KB?
我相信操作系统应该为这种违规行为保护内存,但它允许我?为什么 ?
用于将某些内容放入共享内存段的生产者源代码
#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;
我的系统也有 4KiB 页面大小,我的默认堆栈大小是 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
space 的开头,它就在堆栈 (8KiB) 旁边,溢出 4KiB 会导致堆栈被破坏 space,之后这是段错误。
我正在使用 shared_memory 使用 POSIX..
我已经分配了 4KB,但我可以使用超过 4KB 的空间...当我将超过 ~10350 个字符写入内存时,它会给我一个分段错误。等于 ~10350 字节 / 1024 = ~10KB?
我相信操作系统应该为这种违规行为保护内存,但它允许我?为什么 ?
用于将某些内容放入共享内存段的生产者源代码
#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;
我的系统也有 4KiB 页面大小,我的默认堆栈大小是 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
space 的开头,它就在堆栈 (8KiB) 旁边,溢出 4KiB 会导致堆栈被破坏 space,之后这是段错误。