我最近遇到了关于 msgget 的问题。
while(1)
{
msqid = msgget(IPC_PRIVATE,IPC_CREAT);
if(msqid<0)
break;
printf("msqid=%d\n",msqid);
}
很快,它会消耗内核中的所有msqid。
因为msgget是内核持久性的,所以下次进程运行并立即退出ENOSPC。
虽然配置sysconf来解决问题。但如果恶意代码继续运行,我应该反复重新配置。
在我看来,这是一种严重的泄漏,并使其他过程缺乏msqid。
系统管理员如何避免这种情况?
答案 0 :(得分:3)
所有SysV IPC接口(共享内存,信号量等)在许多其他问题中都存在同样的问题,其中最糟糕的是由于设计不良而导致性能恶劣,其中每个操作都需要调用内核空间。如果可以,请放弃这些接口并使用等效的POSIX替换(mq_*
作为消息队列。)
答案 1 :(得分:0)
使用top和strace查找不断创建消息队列并终止该进程的进程。 (这假设是linux;其他unix拥有相同的工具)