在函数运行时出错,查找日志发现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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/312079/viewspace-2147640/ ,如需转载,请注明出处,否则将追究法律责任。