我最近遇到了这样一个关于格特的问题。
while(1)
{
msqid = msgget(IPC_PRIVATE,IPC_CREAT);
if(msqid<0)
break;
printf("msqid=%d\n",msqid);
}
很快,它就会消耗内核中的所有msqid。
由于msgget是内核持久性的,下次,进程将立即运行并退出enospc。
尽管配置了sysconf来解决这个问题。但如果恶意代码继续运行,我应该一次又一次地重新配置。
在我看来,这是一种严重的泄漏,并使其他过程缺乏msqid。
系统管理员如何避免这种情况?
最佳答案
所有sysv ipc接口(共享内存、信号量等)都有同样的问题,其中最糟糕的问题是由于设计不好而导致的性能糟糕,每个操作都需要调用kernelspace。如果可以,请放弃这些接口并使用等效的posix替换(mq_*
用于消息队列)。