1

我最近遇到了有关msgget的此类问题。

while(1)
{
     msqid = msgget(IPC_PRIVATE,IPC_CREAT);
     if(msqid<0)
           break;
     printf("msqid=%d\n",msqid);
}

很快,它消耗了内核中的所有 msqid。

因为 msgget 是内核持久的,所以下一次,该进程立即运行并退出 ENOSPC。

虽然配置 sysconf 来解决问题。但如果恶意代码继续运行,我应该一次又一次地重新配置。

在我看来,这是一种严重的泄漏,并使其他进程缺少 msqid。

系统管理员如何避免这种情况?

4

2 回答 2

3

所有 SysV IPC 接口(共享内存、信号量等)都存在同样的问题,除此之外还有许多其他问题,其中最糟糕的是由于糟糕的设计导致的糟糕性能,其中每个操作都需要调用内核空间。如果可以,请放弃这些接口并使用等效的 POSIX 替换(mq_*对于消息队列)。

于 2010-11-26T15:26:02.797 回答
0

使用 top 和 strace 查找不断创建消息队列的进程并终止该进程。(这假设 linux;其他 unix 有等效的工具)

于 2010-11-26T13:49:33.720 回答