[informix@onxrjs302 ~]$oninit -ivy
Checking group membership to determine server run mode...succeeded
Reading configuration file '/home/informix/etc/S302.cfg'...succeeded
Creating /INFORMIXTMP/.infxdirs...succeeded
Checking config parameters...succeeded
Allocating and attaching to shared memory...succeeded
Creating resident pool 280260 kbytes...succeeded
Allocating 200016 kbytes for buffer pool of 2K page size...succeeded
Creating infos file "/home/informix/etc/.infos.onxrjs302"...succeeded
Linking conf file "/home/informix/etc/.conf.onxrjs302"...succeeded
oninit: Fatal error in shared memory creation
Initializing rhead structure...FAILED
WARNING: server initialization failed, or possibly timed out (if -w was used).
Check the message log, online.log, for errors.
[informix@onxrjs302 ~]$onstat -m
shared memory not initialized for INFORMIXSERVER 'onxrjs302'
Message Log File: /home/informix/S302.log
09:24:30 IBM Informix Dynamic Server Started.
09:24:31 semget: errno = 28
09:24:31 create_vp: cannot allocate semaphore
[informix@onxrjs302 ~]$
解决办法参考如下:http://blog.csdn.net/miss_acha/article/details/10976635
在函数运行时出错,查找日志发现semget函数报错,errno设置为28。遇到系统调用发生错误的情况,可以尝试以下几种思路:
1. 使用strerror函数或者perror函数输出错误说明。
2. 如果第一步还不是很清楚,可以根据errno的值找出对应的错误标示,然后再详细查阅出错系统函数的man手册,找到对应错误标示的含义。
PS:大部分时候还是需要采用方法2,例如这次semget函数报错,errno设置为28,我一开始根本不记得28的错误标示是什么,采用strerror函数返回的错误说明为“No space left on device”,我还误以为系统内存不够。最后通过查看errno.h头文件才发现28的错误标示是ENOSPC,再去查semget函数的man手册,查看ENOSPC的具体含义是信号量超出系统限制:A semaphore set has to be created but the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores。
解决办法:可以临时修改内核参数(当然这只是权宜之计,我们最好是找到为什么信号量会超出系统限制,因为正常情况下可能性不大。)
1)sysctl命令可以查看和设置系统内核参数
sysctl -a | grep sem #查看系统信号量的设置值
kernel.sem = 250 32000 32 128
对应的4个值从左到右分别为SEMMSL、SEMMNS、SEMOPM和SEMMNI。
2)修改方法有三种:数字只作为参考
方法一:echo 610 86620 100 142 > /proc/sys/kernel/sem
方法二:sysctl -w kernel.sem="610 86620 100 142"
方法三:echo "kernel.sem=610 86620 100 142" >> /etc/sysctl.conf
errno的值对应的错误标示,定义在/usr/include/errno.h头文件中,但是该头文件也是包含其他头文件的。这些标示实际上是定义在下面两个头文件中:
/usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h