informix初始化的时候报:semget:errno=28该怎么办-创新互联

informix初始化的时候报: semget: errno = 28该怎么办,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联公司网站建设公司提供网站设计和自适应建站服务。团队由有经验的网页设计师、程序员和市场专家组成,能够提供从H5网站设计,网站制作,一元广告,模板建站到小程序定制开发等全方位服务。 以客户为中心,致力于为客户提供创新、高效的解决方案,帮助您打造成功的企业网站。

[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

看完上述内容,你们掌握informix初始化的时候报: semget: errno = 28该怎么办的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联-成都网站建设公司行业资讯频道,感谢各位的阅读!


网页题目:informix初始化的时候报:semget:errno=28该怎么办-创新互联
浏览地址:http://myzitong.com/article/dgpgij.html