semget函数报错,errno设置为28

8 篇文章 1 订阅

在linux下运行semget创建信号量时,遇到返回-1,创建失败的问题;

一、这个函数是系统函数,只能同过errno来确认实际的错误码,通过strerror打印errno返回No space left on device。难道是系统空间不足?创建信号量的空间不足?
二、再去errno.h中查看实际的错误码对应的错误信息ENOSPC,这个字段是什么意思?
三、semget函数中有规定自己的错误字段?查看函数手册:查semget函数的man手册: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命令可以查看和设置系统内核参数
#对应的4个值从左到右分别为SEMMSL、SEMMNS、SEMOPM和SEMMNI。
sysctl -a | grep sem        #查看系统信号量的设置值
kernel.sem = 250        32000   32      128


#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`


#3)查看系统当前信号量和 pid 以及 用户 信息,查看更多信息查--help
ipcs -s -p -c 


#4)删除指定 semid 的信号量方法,更多用法查--help
ipcrm -s semid


#5)删除所有 semid 的信号量方法
ipcrm  -asem
五、这里在查找信号量资源泄漏过程中,为了方便实时查看信号量信息,将信号量输出写入脚本,循环打印
#ipcs.sh
echo “ipcs -s loop”

while [ 1 ]
do
	sleep 1
	ipcs -s
done

六、注意:这里最终的问题是需要查看代码中为什么会导致信号量超出限制,正常来说信号量不会超出系统限制的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: semget函数是Unix/Linux系统中的一个系统调用函数,用于获取一个信号量集的标识符(也称为信号量集ID)。它通常与其他信号量函数(如semop、semctl)一起使用,用于实现进程间同步和互斥。 semget函数的调用格式为: ``` #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); ``` 其中,key是唯一的键值,用于标识信号量集;nsems指定信号量集中信号量的数量;semflg是标志位,指定semget函数的行为。 semget函数的返回值是一个非负整数,即信号量集的标识符,如果出现错误则返回-1。可以通过该标识符对信号量集进行操作,如设置信号量的值、等待信号量、释放信号量等。 需要注意的是,使用信号量集前需要对其进行初始化,可以使用semctl函数进行初始化操作。同时,在使用完信号量集后,应该使用semctl函数将其删除,避免出现资源泄漏的问题。 ### 回答2: semget函数是在Linux中用于创建或获取一个信号量集的函数。它的函数原型为: int semget(key_t key, int nsems, int semflg); 参数key是唯一标识一个信号量集的键值,可以使用ftok函数生成。参数nsems指定需要创建的信号量数量。参数semflg可以控制信号量集的访问权限和其他操作标志。 当调用semget函数时,它会检查指定键值的信号量集是否已经存在。如果存在,则返回该信号量集的标识符(即信号量集的ID)。如果不存在,则根据指定的键值和信号量数量创建一个新的信号量集,并返回新创建的信号量集的ID。 semget函数返回的ID可以用于后续的信号量操作函数,如semop,用于对信号量集进行加减操作。多个进程可以通过该ID共享对信号量集的访问。在使用完信号量集后,可以使用semctl函数对其进行删除或控制其他属性。 通常,semget函数的返回值为正数表示成功,返回值为-1表示失败。失败的原因可能是给定的键值无效、对信号量集的数量进行了非法的操作等。 总的来说,semget函数是用于创建或获取信号量集的函数。它通过键值来标识一个信号量集,并返回一个标识符用于后续对其进行操作。通过信号量集,可以实现进程间的同步与互斥,实现进程间共享资源的控制。 ### 回答3: semget函数Linux系统中用于创建或获取一个信号量集的函数。该函数的主要功能是根据给定的key值和标志位创建一个新的信号量集,或者根据给定的key值和标志位获取已存在的信号量集的标识符。 函数原型为: int semget(key_t key, int nsems, int semflg); 其中,key是一个键值,用来唯一标识一个信号量集,nsems是信号量集中信号量的数量,semflg是标志位,在创建新的信号量集时指定该信号量集的权限以及其他的一些标志。 semget函数的返回值是一个整型的信号量集标识符,用于后续对该信号量集进行操作。 当调用semget函数时,会根据给定的key值以及标志位进行以下操作: 1. 如果给定的key对应的信号量集已存在,则semget函数会返回该信号量集的标识符。 2. 如果给定的key对应的信号量集不存在,且同时指定了IPC_CREAT标志,则semget函数会创建一个新的信号量集,并返回其标识符。 3. 如果给定的key对应的信号量集不存在,并且没有指定IPC_CREAT标志,则semget函数会返回一个错误。 通常,semget函数与其他的信号量操作函数(如semop、semctl等)一起使用,用于对信号量集进行锁定、释放等操作。 总之,semget函数Linux系统中用于创建或获取信号量集的函数,通过给定的key值和标志位,可以创建新的信号量集或获取已存在的信号量集的标识符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值