转载

informix初始化的时候报: semget: errno = 28

[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



正文到此结束
Loading...