Hvordan laver jeg Windows-fillåsning mere som UNIX-fillåsning?

Indlæg af Hanne Mølgaard Plasc

Problem



UNIX-fillåsning er død-nem: Operativsystemet forudsætter, at du ved, hvad du laver og lader dig gøre, hvad du vil:


Hvis du for eksempel forsøger at slette en fil, som en anden proces har åbnet, vil operativsystemet normalt lade dig gøre det. Den oprindelige proces holder det stadig s filhåndteringer, indtil det afsluttes - på hvilket tidspunkt vil filsystemet stille genbruge diskressourcerne stille. Det er ikke sådan, det er sådan jeg kan lide det.


Hvor forskellige ting er der på Windows: Hvis jeg forsøger at slette en fil, som en anden proces bruger, får jeg en operativsystemfejl. Filen er ukontrolbar, indtil den oprindelige proces frigiver dens lås på filen. Det var godt tilbage i single-user-dage med MS-DOS, når en låseproces sandsynligvis ville være på den samme computer, der indeholdt filerne, dog på et netværk det er et mareridt:


Overvej hvad der sker, når en proces hænger, mens du skriver til en delt fil på en Windows-filserver. Før filen kan slettes, skal vi finde computeren og identificere processen på den computer, der oprindeligt åbnet filen. Først da kan vi dræbe processen og slette vores uønskede fil.


Hvad en gener!


Er der en måde at gøre det bedre på? Hvad jeg vil have, er til fillåsning på Windows for at opføre en lignende fillåsning i UNIX. Jeg vil have operativsystemet til bare at lade mig gøre, hvad jeg vil, fordi jeg er ansvarlig, og jeg ved hvad jeg gør ...


... så kan det gøres?

Bedste reference


Ifølge MSDN kan du angive CreateFile () 3rd parameter (dwSharedMode) delt tilstand flag FILE\_SHARE\_DELETE som:



  Aktiverer efterfølgende åbne operationer på en fil eller enhed for at anmode om at slette adgang.

  
  Ellers kan andre processer ikke åbne filen eller enheden, hvis de anmoder om sletning af adgang.

  
  Hvis dette flag ikke er angivet, men filen eller enheden er blevet åbnet for sletningstilgang, fejler funktionen.

  
  Bemærk Slet adgang tillader både at slette og omdøbe operationer.



http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx[2]


Så hvis du kan styre dine applikationer, kan du bruge dette flag.

Andre referencer 1


Nej. Windows er designet til 'gennemsnitsbrugeren', det er mennesker, der ikke forstår noget om en computer. Derfor forsøger operativsystemet at være smart for at undgå PEBKAC'er. For at citere Bill Gates: 'Der er ingen problemer med Windows, der et hvilket som helst antal mennesker ønsker at blive rettet. 'Selvfølgelig ved han, at 99,9999\% af alle Windows-brugere ikke kan fortælle om programmet bare gjorde noget mærkeligt på grund af dem eller den fyr der skrev det. [3]


Unix blev designet, når verden var mere enkel, og nogen tæt nok til en computer til at røre ved det, vidste sikkert, hvordan man monterede det fra snavset sand. Derfor kan OS normalt lade dig gøre hvad du vil, fordi det antager, at du ved bedre (og hvis du ikke gjorde det, vil du næste gang).


Teknisk svar: Unix tildeler en 'i-noder', hvis du opretter en fil. I-noder kan deles mellem processer. Hvis to processer opretter samme fil (det vil sige to processer kalder oprette () med samme sti), så slutter du med to i-noder. Dette er ved design. Det giver mulighed for en fancy sikkerhedsfunktion: Du kan oprette filer, som ingen kan åbne, men dig selv:



  1. Åbn en fil

  2. Slet det (men hold filhåndtaget)

  3. Brug filen som du vil

  4. Luk filen



Efter trin # 2 er den eneste proces i universet, der kan få adgang til filen, den, der oprettede den (medmindre du vil læse harddiskblokken efter blok). OS'et vil holde dataene levende indtil du enten lukker filen eller din proces dør (på hvilket tidspunkt vil Unix rydde op efter dig).


Dette design er grundlaget for alle Unix-filsystemer. Windows-filsystemet NTFS fungerer meget på samme måde, men API'en på højt niveau er anderledes. Mange applikationer åbner filer i eksklusiv tilstand (som forhindrer nogen, endda sikkerhedskopieringsprogrammer) for at læse filen. Dette gælder endog for applikationer, der bare viser information som PDF-seere.


Det betyder at du bliver nødt til at rette alle Windows applikationer for at opnå den ønskede effekt. Hvis du har adgang til kilden, kan du oprette en fil i en delt tilstand. Det ville give andre processer adgang det på samme tid men så skal du tjekke før hver læs/skriv, hvis filen stadig eksisterer, om nogen har lavet ændringer osv.

Andre referencer 2


Bemærk, at Process Explorer giver mulighed for at lukke filhåndter (for processer lokalt i den boks, du kører det) via Håndtering -> Luk håndtering.


Unlocker sigter at gøre meget mere, og giver en nyttig liste over andre værktøjer. [4]


Også sletning ved genstart er en mulighed (selvom det ikke lyder som det du vil)

Andre referencer 3


Det hjælper ikke virkelig, hvis den hængte proces stadig har håndtaget åbent. Det vil ikke frigøre ressourcerne, før det hængte proces frigiver håndtaget. Men i hvert fald i Windows er det muligt at tvinge en fil ud af en proces, der bruger den. Process Explorer fra sysinternals.com giver dig mulighed for at se på og lukke håndtag, som en proces har åbnet.