我目前正在编写一个网络服务器,以更好地熟悉进程和进程间通信。当请求文件时,我将其锁定以确保在读/写期间文件不会发生更改。效果很好。我的问题是如何在守护进程完成执行后清除内存中的锁。我知道信号量在创建它们的进程停止执行后仍然存在。我知道信号量的丢弃需要在父级中完成,但是,信号量是在子级中创建的,这意味着父级中没有引用。所以基本上,它可以归结为:有没有一种方法可以引用在子进程期间创建的信号量,以便我可以在守护进程停止时丢弃退出处理程序中的信号量?我没有代码可以分享,因为我真的不知道如何做到这一点。我在 Linux 系统上用 C 语言编码。 感谢您的帮助!
最佳答案
SemId = semget(IPC_PRIVATE, n, 0600);
您肯定正在使用它来创建信号量。这里,n
是信号量的数量。
SemId
可以位于共享内存中。
这将允许您清除父级中的信号量。
如果您想避免创建全局变量并在父级中获取信号量或使用共享内存中的变量,那么在退出子级之前您绝对可以使用:
semctl(SemId, 0, IPC_RMID, 0);
共享内存必须在父级中完成,可以使用以下方式完成:
ID = shmget(IPC_PRIVATE, sizeof(int) * X, 0600);
共享内存的大小绝对是您的选择。
SemId = (int *) shmat(ID, NULL, 0);
这将为 SemId
分配空间。退出子父级后,父级可以(或任何其他子级)访问此变量并使用上面的 semctl
删除信号量。
您必须将 int *SemID
声明为全局变量。
因此,如果创建信号量时使用 semget
函数,则只需将其值返回给 SemId
即可,如上所述。
如果您决定使用共享内存选项,您必须记住使用以下方法删除该内存的归属空间:
shmdt((void *) SemId);
shmctl(ID, IPC_RMID, NULL);
关于c - 在守护进程中释放信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388171/