- 论坛徽章:
- 0
|
本帖最后由 tqyou85 于 2013-05-20 09:21 编辑
写了一个测试程序,通过shmat共享一块内存。代码如下:- #define FILENAME "/dev/shm/testshm"
- #define SHM_ADDR 0xa1000000
- #define PAGE_SIZE 4096
- #define SHM_LEN 2*PAGE_SIZE
- void *shm_open(char *filename, int len, void *addr, int *id, int flag)
- {
- void *reg = NULL;
- key_t key = ftok(filename, 0);
- if(key == -1)
- {
- perror("ftok error");
- return NULL;
- }
- *id = shmget(key, len, flag|SHM_R|SHM_W|SHM_HUGETLB);
- if(*id == -1)
- {
- perror("shmget error");
- return NULL;
- }
- reg = shmat(*id, addr, 0);
- if(reg == (void *)0xffffffff)
- {
- perror("shmat error");
- return NULL;
- }
- return reg;
- }
- int shm_init()
- {
- FILE *fp;
- int shmid = 0;
- fp = fopen(FILENAME, "w");
- if(fp == NULL)
- {
- printf("fopen error\n");
- return -1;
- }
- fclose(fp);
- shm_open(FILENAME, SHM_LEN, (void *)SHM_ADDR, &shmid, IPC_CREAT);
- return 0;
- }
复制代码 这段代码有时候可以运行,有时候运行会提示shmat error: Invalid argument
ipcs -m看到这块内存已经attach上了:- # ipcs -m
- ------ Shared Memory Segments --------
- key shmid owner perms bytes nattch status
- 0x00000000 4685824 root 644 52 2
- 0x00000000 4718593 root 644 16384 2
- 0x00000000 4751362 root 644 268 2
- 0x000f29f3 4784131 root 600 8192 0
复制代码 man shmat有如下信息:
EINVAL Invalid shmid value, unaligned (i.e., not page-aligned and SHM_RND was not specified) or invalid shmaddr value, or failing attach at brk(), or SHM_REMAP was specified and shmaddr was NULL.
感觉这几个原因都不太可能,有的时候这段程序运行ok。在网上也查了下,一直未找到根本原因,不知道有网友知道的没?
系统内核支持hugetlb,查看/proc/meminfo- HugePages_Total: 64
- HugePages_Free: 62
- HugePages_Rsvd: 0
- HugePages_Surp: 0
- Hugepagesize: 4096 kB
- DirectMap4k: 12288 kB
- DirectMap4M: 512000 kB
复制代码 将SHM_LEN改成4M,shmat可以成功,怀疑跟hugetlb有关,我系统的一个巨页是4096 kB,程序中也设置了hugetlb属性。
|
|