linux系统限制
一次偶然的共享内存打开失败
int shm_fd;
shm_fd = shm_open(shm_name, O_CREAT | O_RDWR | O_LARGEFILE, S_IWUSR | S_IRUSR);
if(shm_fd == -1)
{
fprintf(stderr, "open shm failed errno[%d] [%s]\n", errno, strerror(errno));
return -1;
}
int ret = ftruncate(shm_fd, shm_size);
if(ret != 0)
{
fprintf(stderr, "ftruncate64 failed size[%lu] [%d] [%s]\n", shm_size, errno, strerror(errno));
return -1;
}
shm_size设置为** 4 * 1024 * 1024 * 1024(4GB) **
在ftruncate一直返回errorno 22,无效参数。
EINVAL The argument length is negative or larger than the maximum
file size
我以为是ftruncate不支持太大的内存设置,专门搜相关资料
open
O_LARGEFILE
open设置这个属性,但是发现没有作用
ulimit
ulimit -a 查看进程限制
[root@localhost bin]# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 126767
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 126767
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
修改配置在 /etc/security/limits.conf
应该也不是这里的问题
iniparser
最后定位到是iniparser_getint 返回的值有问题
采用
char str_shm_size[128];
strncpy(str_shm_size, iniparser_getstring(ini, section_name, "8589934592"), sizeof(str_shm_size));
s_config.m_stored_shm_size = strtol(str_shm_size, NULL, 0);
printf("m_stored_shm_size %ld\n", s_config.m_stored_shm_size);