首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Posix共享内存导致总线错误

Posix共享内存导致总线错误
EN

Stack Overflow用户
提问于 2014-10-20 10:38:40
回答 2查看 2.1K关注 0票数 0

我在mips中使用了posix共享内存。节目抱怨:

代码语言:javascript
代码运行次数:0
运行
复制
i: 516095
i: 516096
Bus error

在x86中执行相同的程序是可以的。我想要内核最大支持共享内存大小。

代码语言:javascript
代码运行次数:0
运行
复制
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;
}

我检查了个人电脑,但男人说:

Linux实用程序与POSIX ipcs实用程序不完全兼容。

代码语言:javascript
代码运行次数:0
运行
复制
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

最大塞格大小是3k,但我的程序可以使用(516096 / 1024 = 504k)?

我对sysv ipc还是posix ipc感到困惑?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-20 15:38:04

shm_unlink()只是在shm_open()之后调用,因此这将移除共享内存对象名称,并且一旦所有进程都取消了对象的映射,就会对相关内存区域的内容进行去分配和销毁。在成功的shm_unlink()之后,尝试使用相同名称的对象shm_open()将失败(除非指定了O_CREAT,在这种情况下将创建一个新的、不同的对象)。

因此,您将得到一个总线错误,这是执行机器语言指令的致命失败,这是由于处理器检测到其总线上的异常情况。可能是因为地址对齐无效(访问奇数地址处的多字节数)或访问地址空间外的内存位置。

此外,您可能需要使用sysctl命令检查资源限制,并设置程序所需的正确限制(如果较小)。

代码语言:javascript
代码运行次数:0
运行
复制
$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
票数 1
EN

Stack Overflow用户

发布于 2014-10-20 10:40:54

在Linux上,您可以使用proc(5) (例如,/proc/中的伪文件)(读取它们非常快;您需要像管道一样顺序地读取它们并迅速关闭它们)。

特别是,你可以阅读/proc/sys/kernel/shmmax & /proc/sysvipc/shm等.

另见概览(7)

您可能应该比调用断开链接(3)晚得多,也就是说,毕竟您使用了共享内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26463614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档