c - Windows - Sådan rengøres delte hukommelsesobjekter, der efterlades af processer, der afsluttes unormalt?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har encoutered med et problem, hvor en proces afsluttedes unormalt, og derfor blev nogle delte ressourcer (BaseNamedObjects), der ikke blev frigivet af processen.


CreateFileMapping funktionen returnerer ERROR\_ALREADY\_EXISTS, som indikerer delt hukommelse eksisterer allerede.


Efter at have fået ERROR\_ALREADY\_EXISTS af CreateFileMapping vender tilbage et håndtag.
Så jeg har følgende spørgsmål relateret til ovenstående scenario:



  1. Kan vi udføre oprydning ved hjælp af dette returnerede håndtag?

  2. Kan vi bruge håndtaget tilbage med CreateFileMapping?

  3. Sådan rengøres et sådant delt hukommelsesobjekt?


Bedste reference


Håndtaget, der returneres, er helt gyldigt for at du kan fortsætte med at bruge, og du skal lukke det håndtag, når du er færdig med at bruge det som normalt. Men lukning af håndtaget vandt ikke hukommelsen eller udfører oprydning: Dit nye opkald har øget referencencen til den delte ressource, og lukningen vil bare reducere den tilbage til sin tidligere tilstand.


Det ser sandsynligt ud, at der er en anden proces, der stadig bruger den delte hukommelse, da operativsystemet skal genoprette det efter en proces afsluttes dårligt.


Du har måske brug for en eller anden måde at udløse den anden proces til selvdestruktion. En måde er at reservere en lille hjerteslagsdisk i regionen. Hvis en af ​​processerne ser, at den anden ikke har opdateret sin hjerteslag tæller for nylig, skal den også afbryde frigivelsen af ​​den delte ressource.


Måske er din anden proces ikke rent faktisk død, men er i en dødelig looping eller håbløs ventetilstand. Hvis du vil gendanne fra denne sag, kan du gemme alle proces-id'er i det delte område, og enhver ny proces med adgang til den delte region kan så dræbe alle de gamle deltagere.