Domanda
ho incontrato con una tale domanda su msgget di recente.
while(1)
{
msqid = msgget(IPC_PRIVATE,IPC_CREAT);
if(msqid<0)
break;
printf("msqid=%d\n",msqid);
}
soonly, consuma tutto il msqid nel kernel.
Perché il msgget è kernel-persistente, la prossima volta, la corsa di processo e uscire con ENOSPC immdiately.
Anche se la configurazione del sysconf a Compass il problema. ma dovrei riconfigurare ancora e ancora se il codice maligno continua a funzionare.
E 'un grave tipo di perdite, le mie opinioni, e fare altro processo sia in mancanza di msqid.
Come sistema administror per evitare questo?
Soluzione
Tutte le interfacce SysV IPC (memoria condivisa, semafori, ecc) hanno lo stesso problema, tra i molti altri problemi, la peggiore delle quali è la prestazione atroce a causa di cattiva progettazione in cui ogni operazione richiede una chiamata in kernelspace. Se è possibile, abbandonare queste interfacce e utilizzare le sostituzioni POSIX equivalenti (mq_*
per code di messaggi).
Altri suggerimenti
Usa superiore e strace per trovare il processo che continua a creare le code di messaggi e uccidere quel processo. (Ciò presuppone Linux; altri Unix hanno strumenti equivalenti)