Memory management 如果在C中没有对信号量调用sem_destroy(),会发生什么?

Memory management 如果在C中没有对信号量调用sem_destroy(),会发生什么?,memory-management,operating-system,semaphore,Memory Management,Operating System,Semaphore,这是关于C语言中的信号量编程 sem_t互斥体; . . int main { sem_init&mutex,0,1; . . . . sem_销毁和互斥; 返回0; } 它是特定于操作系统的。在Linux上,阅读;事实上,你是在一个未指明的情况。然而,文件说 在使用之前,必须初始化未命名的信号量 使用sem_init3。然后,可以使用 sem_post3和sem_wait3。当信号量不再是 必需,并且在其所在的内存 如果取消分配,则应使用 扫描电镜3 所以你应该在适当的时候打电话给sem_d

这是关于C语言中的信号量编程

sem_t互斥体; . . int main { sem_init&mutex,0,1; . . . . sem_销毁和互斥; 返回0;
} 它是特定于操作系统的。在Linux上,阅读;事实上,你是在一个未指明的情况。然而,文件说

在使用之前,必须初始化未命名的信号量 使用sem_init3。然后,可以使用 sem_post3和sem_wait3。当信号量不再是 必需,并且在其所在的内存 如果取消分配,则应使用 扫描电镜3

所以你应该在适当的时候打电话给sem_destroy;不要冒全系统资源泄漏的风险。顺便说一句,以下文件:

未命名的信号量应在销毁之前使用sem_destroy进行销毁 它所在的内存被解除分配。没有做到这一点 可能导致某些实现上的资源泄漏

对于命名信号量,它们位于/dev/shm/中的情况有所不同。我猜想,当任何进程都不再映射线程共享的信号量的内存段时,它可能会被销毁。我不确定这一点,这是特定于实现的行为,所以不要依赖于此

也使用

因此,可能发生的事情是一个系统范围内的,你不想要它。您可能需要重新启动才能删除它。顺便说一句,您可以使用查找实际涉及的系统调用,您可以查看GNU或其他一些libc的源代码,比如Linux内核的源代码,以了解更多特定于实现的行为


避免。

如果不使用sem\u destroy,存储信号量的地址将保留信号量的最后一个值


这可能会导致问题,因为信号量的前一个值可能指示进程仍在运行,即使它不是

我听说它会导致内存泄漏,我会找出更多答案。既然你提到了sem_destroy,我们是在讨论用C编写的程序吗?什么问题,这就是问题所在。那么你的意思是,除非我销毁信号量,否则分配给程序的资源不会被取消分配?是的,可能会发生,也可能不会发生!。确切的行为尚未定义,并且是特定于实现的。