linux posix shared memory: bus error
2017-01-16 17:32
866 查看
用posix shared memory在两个进程之间传输600KB的数据,但是写进程在写数据的时候,老是出现bus error的错误,网上搜了一下信息,这个错误应该是由于posix shared memory文件大小有限制,申请了600KB,查看/dev/shm/cam也有600KB,但是实际上可写的没有600KB,写了下面的小程序验证。
编译方法:arm-linux-gcc -o shmtest shmtest.c -lrt运行:
shmtest 65536 程序正常运行
shmtest 65537 程序出错
说明文件大小限制在64KB,但是一直找不到修改posix
shared memory文件大小的方法。后来发现在挂载文件系统时,把dev目录大小限制在64KB,而shm就在dev目录下,应该是这个问题。
/etc/init.d/rcS中原来挂载文件系统脚本代码:
mount -t tmpfs -o size=64k,mode=0755 none /dev
mkdir -p /dev/shm
改成:
mount -t tmpfs -o size=2048k,mode=0755 none /dev
mkdir -p /dev/shm
mount -t tmpfs -o size=1024k none /dev/shm
tmpfs
问题解决。
测试程序源码:
shmtest.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h> /* ftruncate */
#include <assert.h>
#include <errno.h>
#include <fcntl.h> /* Defines O_* constants */
#include <sys/stat.h> /* Defines mode constants */
#include <sys/mman.h>
#include <limits.h>
typedef struct __cam_img_s {
unsigned char *addr;
unsigned char *r, *w, *v;
unsigned char *img_dat;
unsigned long size;
}cam_img_t;
static cam_img_t *g_cam_img = NULL;
static cam_img_t *zbar_processor_get_cam_mmap(void)
{
g_cam_img = (cam_img_t *)calloc(1, sizeof(cam_img_t));
printf("%d %s, g_cam_img addr=%p\n", __LINE__, __func__, g_cam_img);
return g_cam_img;
}
static unsigned char * create_img_map(const char *name, unsigned int size)
{
int fd = -1;
unsigned char *addr = NULL;
fd = shm_open(name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd < 0) {
printf("create img share memory err(%s)\n", strerror(errno));
return NULL;
}
if (ftruncate(fd, size) == -1) {
printf("set mmap file size(%u) err(%s)\n", size, strerror(errno));
close(fd);
return NULL;}
addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (MAP_FAILED == addr) {
printf("mmap err(%s)\n", strerror(errno));
close(fd);
return NULL;
}
close(fd);
return addr;
}
int main(int argc, const char *argv[])
{
int img_size = 640*480*2;
if (argc > 1)
img_size = atoi(argv[1]);
printf("img size=%d\n", img_size);
cam_img_t *cam_img_ptr = zbar_processor_get_cam_mmap();
memset(cam_img_ptr, 0, sizeof(*cam_img_ptr));cam_img_ptr->size = img_size;
cam_img_ptr->addr = create_img_map("/cam", cam_img_ptr->size + 3);
if (cam_img_ptr->addr) {
cam_img_ptr->r = cam_img_ptr->addr;
cam_img_ptr->w = cam_img_ptr->addr + 1;
cam_img_ptr->v = cam_img_ptr->addr + 2;
cam_img_ptr->img_dat = cam_img_ptr->addr + 3;
*cam_img_ptr->r = *cam_img_ptr->w = *cam_img_ptr->v = 0;
}
while (1) {
memset(cam_img_ptr->img_dat, 0, cam_img_ptr->size); // 这里会bus error
sleep(1);
}
return 0;
}
相关文章推荐
- Shared memory on Linux(difference posix and systemv )
- How to list processes attached to a shared memory segment in linux?
- Linux内存管理: Linux Kernel Shared Memory 剖析 Linux 内核中的内存去耦合
- Sample Code on Linux semaphore and shared memory
- Linux Kernel Shared Memory 剖析
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux Error: 2: No suc
- Oracle因开启大页内存无法启动ORA-27100: shared memory realm already exists Linux-x86_64 Error: 17: File exists
- Linux内存管理: Linux Kernel Shared Memory 剖析 Linux 内核中的内存去耦合
- ORA-27125: unable to create shared memory segment Linux-x86_64 Error: 1: Operation not permitted
- Linux shared Memory的写入与读取
- Linux Kernel Shared Memory 剖析
- Linux-004-解决 Tomcat 启动时提示 Insufficient space for shared memory file
- Linux Kernel Shared Memory 剖析
- linux ipc——shared memory
- ORA-27125: unable to create shared memory segment Linux-x86_64 Error: 1: Operation not per
- Linux 的 Out-of-Memory (OOM) Killer
- Linux Device Drivers 3rd Edition Memory Mapping and DMA
- shared memory realm does not exist(8i)
- Linux SNMP OID’s for CPU,Memory and Disk Statistics
- (原創) 如何解決Java在Linux上『libXp.so.6: cannot open shared object file: No such file or directory』的錯誤訊息? (OS) (Linux) (CentOS) (Java)