温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

informix初始化的时候报: semget: errno = 28该怎么办

发布时间:2021-11-04 17:36:49 来源:亿速云 阅读:165 作者:柒染 栏目:建站服务器

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

看完上述内容,你们掌握informix初始化的时候报: semget: errno = 28该怎么办的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI