我目前正在编写一个web服务器以更好地熟悉进程和进程间通信。当请求一个文件时,我将其锁定,以确保在读取/写入期间文件没有变化。这工作正常。我的问题是如何在守护进程完成执行后清除内存中的锁。我知道信号量在创建它们的进程停止执行之后仍然存在。我知道丢弃信号量需要在父项中完成,但是信号量是在子项中创建的,这意味着父项中没有引用。所以基本上,这归结为:是否有一种方法可以引用子进程期间创建的信号量,以便在守护进程停止时可以丢弃退出处理程序中的信号量?我没有代码可以分享,因为我真的不知道如何做到这一点。我在Linux系统上使用C编码。 感谢您的帮助!在守护进程中释放信号灯
0
A
回答
0
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);
相关问题
- 1. Web.py守护进程通信
- 2. 蟒蛇守护进程中的信号处理
- 3. Linux守护进程
- 4. iphone守护进程
- 5. Python守护进程
- 6. 设计建议:通过HTTP向守护进程发送信号
- 7. 管理fork()的守护进程的信号处理
- 8. 如何使python守护进程处理systemd信号?
- 9. 守护进程将不会注册sigint信号
- 10. 如何发信号守护进程来改变行为
- 11. C++守护进程将不会收到SIGCHLD信号
- 12. PHP <5.3.0守护进程脚本何时接收信号?
- 13. python守护进程信号处理:无法覆盖默认值
- 14. 在java中的守护进程线程
- 15. Linux守护进程停止启动 - 停止守护进程
- 16. 定时器()作为守护进程与非守护进程
- 17. Java中的守护进程和非守护线程优先级
- 18. java守护进程线程
- 19. 如何在Java守护进程中捕获Linux用户注销信号?
- 20. Windows中的进程间信号灯
- 21. 如果非守护进程线程正在等待守护进程,
- 22. 在MAC OSX中启动守护进程
- 23. Python:在Windows7中运行守护进程
- 24. 在java中制作unix守护进程
- 25. 在gradle中调试jetty守护进程
- 26. 在python中编写守护进程
- 27. 使用/ proc提供守护进程的进程信息
- 28. python守护进程+进程间通信+ web服务器
- 29. 在守护进程线程中创建的进程的主线程是守护进程本身吗?
- 30. 守护进程结构
好感谢。我为每个被访问的文件创建一个信号量,所以我可以得到与给定目录中的文件一样多的信号量(全部在不同的时间创建)将清除semid,足以清除所有的信号量,如果它们被创建分别? – tpar44
如果有多个信号灯,这意味着你有几个不同的'SemId'。这意味着你必须为每个文件调用'semctl'。 最简单的解决方案是知道文件数量并获得与父文件数量相等的信号量。 如果您正在测试使用'ipcs -s num'和 'ipcrm -s'来清除任何它们,如果它们离开。 – 2012-11-14 22:43:45
事实上,当我想到它时,您只需通过创建新的信号量来重写'SemId',所以我想有时候您将无法删除它们。 您确定只能使用一个信号灯吗? – 2012-11-14 22:50:51