我在mips中使用了posix共享内存。节目抱怨:
i: 516095
i: 516096
Bus error
在x86中执行相同的程序是可以的。我想获得内核最大支持共享内存大小。
int ret;
int bufsize = 517120;
shmfd = shm_open(NAME_SHM, O_RDWR|O_CREAT|O_EXCL, FILE_OP);
shm_unlink(NAME_SHM);
if(shmfd < 0) {
sys_err("Create share memory failed: %s\n", strerror(errno));
exit(-1);
}
ret = ftruncate(shmfd, bufsize);
if(ret < 0) {
sys_err("Alloc share memory failed: %s\n", strerror(errno));
exit(-1);
}
char *ptr = mmap(NULL, bufsize,
PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
if(ptr == MAP_FAILED) {
sys_err("Mmap failed: %s\n", strerror(errno));
exit(-1);
}
struct stat buf;
fstat(shmfd, &buf);
printf("size: %d, total: %d\n", buf.st_size, bufsize);
int i;
for(i = 0; i < bufsize; i++) {
printf("i: %d\n", i);
ptr[i] = 0;
}
我检查了ipcs,但是男人说:
Linux ipcs实用程序与POSIX ipcs实用程序不完全兼容。
root@AnyWiFi:~# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 3
max total shared memory (pages) = 2097152
min seg size (bytes) = 1
root@AnyWiFi:~# cat /proc/sys/kernel/shmmax
3740
root@AnyWiFi:~# cat /proc/sys/kernel/shmall
2097152
root@AnyWiFi:~# cat /proc/sys/kernel/shmmni
4096
max seg size是3k,但我的程序可以使用(516096/1024 = 504k)?
我对sysv ipc vs posix ipc感到困惑?
答案 0 :(得分:1)
在Linux上,您可以使用proc(5),例如/proc/
中的伪文件(读取它们很快;您需要像管道一样顺序读取它们并快速关闭它们。)
特别是,您可以阅读/proc/sys/kernel/shmmax
&amp; /proc/sysvipc/shm
等......
你可能应该比你更晚地调用shm_unlink(3),即在使用共享内存之后。
答案 1 :(得分:1)
所以你得到一个总线错误,这是由于处理器检测到其总线上的异常情况而导致执行机器语言指令的致命失败。可能由于无效的地址对齐(访问奇数地址处的多字节字节数)或访问其地址空间之外的存储器位置而不存在。
此外,您可能需要检查资源限制并使用sysctl
命令
$ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
------ Messages Limits --------
max queues system wide = 15747
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384