J
Das Problem kommt mir sehr bekannt vor
Ich nehme jetzt immer meine folgende C-Funktion:
int detachShm(shmid)
int shmid; /* I: valid shm id got by previous shmget() */
/* ret: 0 on success */
/* <0 if any error */
/* procedure releases a shared memory */
{
char hstr[STRLGTH]; /* help variable */
char *cp; /* help variable */
int retval; /* help variable */
int ret; /* return variable */
ret = 0;
XBUG(DBG_TEST) { fprintf(dbgfile,">>>detachShm(): start, shmid=%d\n",shmid); fflush(dbgfile); }
if (shmid < 0)
{
ret = -10;
syserror("detachShm(): shmid < 0");
goto errex;
}
cp = (char *) shmat(shmid,NULL,0);
if (cp != NONE)
{
ret = shmdt((void *) cp);
if (ret < 0)
{
ret = -20;
sprintf(hstr,"detachShm(): shmdt() returns error, errno=%d",errno);
warning(hstr);
}
ret = shmctl(shmid,IPC_RMID,NONE);
if (ret < 0)
{
ret = -21;
sprintf(hstr,"detachShm(): shmctl(%d,IPC_RMID,0) detaching returns error, errno=%d",shmid,errno);
warning(hstr);
}
}
errex:
XBUG(DBG_TEST) { fprintf(dbgfile,">>>detachShm(): end, ret=%d\n",ret); fflush(dbgfile); }
return(ret);
}
Wichtig ist halt der Aufruf "shmctl()". Sollte dann funktionieren (auch auch verschiedenen Unix-Derivaten).
Wenn das Programm allerdings ohne Freigabe des shm abschmiert, ist das shm weiterhin belegt. Aber das ist ein anderes (oder nächstes) Problem und läßt sich auch lösen