gpt4 book ai didi

c - 使用后如何正确删除信号量?

转载 作者:行者123 更新时间:2023-12-05 06:10:58 24 4
gpt4 key购买 nike

我正在使用大量信号量来同步对共享内存的多进程访问。

我通过初始化信号量

int scount = 80000;
int semid = semget(IPC_PRIVATE, scount, 0666 | IPC_CREAT);

效果很好。

在程序结束时,我删除了通过

设置的信号量
semctl(semid, 0, IPC_RMID);

但是,当我通过

检查系统中的信号量时
ipcs -S 

在控制台中,我看到它们仍然存在。

seminfo:
semmap: 30 (# of entries in semaphore map)
semmni: 8 (# of semaphore identifiers)
semmns: 80064 (# of semaphores in system) <------ ????
semmnu: 0 (# of undo structures in system)
semmsl: 87381 (max # of semaphores per id)
semopm: 5 (max # of operations per semop call)
semume: 10 (max # of undo entries per process)
semusz: 32 (size in bytes of undo structure)
semvmx: 32767 (semaphore maximum value)
semaem: 16384 (adjust on exit max value)

我还尝试在控制台中手动删除它们

ipcrm -s [semid]

这似乎可以很好地删除集合(即 semid 在命令之前列在 ipcs -s 中并在命令之后消失)。然而 ipcs -S 仍然显示

semmns:  80064  (# of semaphores in system)

如何在使用后正确清理信号量,使它们不再出现在 "semmns: .... (# of semaphores in system)" 中?

我问的原因是,如果信号量没有正确清理,我下一次运行该程序将无法运行,因为打开的信号量数量将超过限制。我需要重新启动才能将其重置为 0。

PS:我使用的是 Mac 操作系统,但也希望它能在 Linux 上运行。


semget 不返回错误。当我通过以下方式初始化信号量集时,错误发生在下一步:

semun_t semun = {.val = 1}; // initial semaphore value => 1 = released
for (int i=0; i<scount; i++){
if(semctl(semid, i, SETVAL, semun) == -1) {perror("semctl init");exit(1);}
}

我得到的错误是:

semctl init: Invalid argument

最佳答案

对于遇到同样问题的人:

ipcs -S 调用时,semmns 下显示的数字是目前已使用 的信号灯数量。这并不 意味着它们仍在使用中。因此,即使您正确删除了一个信号量,计数器 semmns 也不会减少。

semctl init: Invalid argument 错误来自于对集合中的信号量数量使用了太大的值。

关于c - 使用后如何正确删除信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64154753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com