Permalänk
Medlem

File lock

Hej, har lite frågor gällande "file lock" hoppas någon som är kunnig inom windows eller hur OS fungerar generellt. Jag vet att file lock är en funktion på både UNIX och Windows där antingen en person kan öppna en fil med write/read access så kan inte den andra person som försöker öppna filen öppna den alls eller enbart med read only access.( Source https://i.imgur.com/GdQeVOH.png)

Det jag egentligen försöker klura ut, hur detta fungerar. Jag har hittat en artikel på MS dokumentation som jag tror är rätt men har svårt och tolka, inte ofta jag läser i dokumentation så svårt och hänga med det är ganska formellt. (https://learn.microsoft.com/en-us/windows/win32/api/fileapi/n...)

Vad jag kan se så är det en API i Windows som man skriver i C# och då kan man kalla på en funktion creatfileAPI? Om jag har förstått det rätt och använda sig av " [in] dwShareMode" för att antingen kunna ge tre rättigheter till hur en fil har för funktion när det gäller tillgång till den när man ska öppna filen.

"[in] dwShareMode

The requested sharing mode of the file or device, which can be read, write, both, delete, all of these, or none (refer to the following table). Access requests to attributes or extended attributes are not affected by this flag.

If this parameter is zero and CreateFile succeeds, the file or device cannot be shared and cannot be opened again until the handle to the file or device is closed. For more information, see the Remarks section."

Är det så här Word,Excel m.m funkar när man t.ex. försöker öppna samma fil på samma nätverk inom samma organisation t.ex. företag, eller shared drive hemma på samma nätverk?

Slutsatsen är, hur fungerar egentligen denna tekniken på OS främst Windows då? Någon som har koll på detta?

Exempel på hur det ser ut när två personer försöka öppna samma fil (https://i.imgur.com/ViB4fdt.png) (https://i.imgur.com/MWcYiVI.png ; Källa https://learn.microsoft.com/en-us/windows-server/troubleshoot...

Källa: https://learn.microsoft.com/en-us/windows/win32/api/fileapi/n...
https://en.wikipedia.org/wiki/File_locking (Under; In Microsoft Windows)

Permalänk
Hedersmedlem

Hej!

Till att börja med så fungerar fillåsning på helt olika sätt på Windows och Linux. På Linux så används i normalfallet "advisory lock" vilket i princip innebär att filerna inte är låsta "på riktigt", utan om två processer vet med sig att det kan bli kaos om båda skriver mot samma fil så kan de använda ett "advisory lock" som är ett API som tillåter två processer att skapa "frivilliga" lås på filen så att det inte blir kaos. Linux har inte längre stöd för mandatory lock sedan version v5.14, och även innan dess så avrådde man från att använda funktionen av olika anledningar, men främst för att implementationen inte var helt perfekt och kunde hänga OS:et...

Men nog om Linux, vi fokar på Windows för det är den forumdelen du är i, och det du vart inne och grävt mest i verkar det som. Det är bara bra att känna till att Windows har mandatory locks, vilket Linux inte har.

På Windows däremot så finns det på filsystem/OS-nivå "mandatory locking" som fungerar mycket bättre, och precis som du är inne på används av office-paketet, som låser filerna på OS-nivå när man öppnar dem. Det funkar även över SMB-fileshares, men om du kör DFS-R-replikering på dina shares så replikeras inte lås över till andra filservrar. Detta p.g.a. att det skulle skapa orimligt mycket latens när man vill ta ett lås. Om du inte vet om du kör DFS-R-replikering kan jag lugna dig med att, det gör du antagligen inte.

(Prova gärna, testa öppna cmd och kör "type" på ett word-dokument. Du kommer få skräp i terminalen som visar att filen går läsa, även om det inte är särskilt läsbart att dumpa ut råa datat i terminalen. Prova sedan öppna dokumentet igen och kör "type" igen, så kommer du se att filen används av en annan process (d.v.s. Word!))

Precis som du hittat så är det parametern dwShareMode till CreateFileA som låter dig välja hur du vill låsa filen.

För att översätta till ren svenska, om du sätter denna till 0 så får inga andra processer göra något med filen medan du har den öppen. Parametern är ett bitfält och du kan välja att ge andra processer mer behörigheter.

Sätter du biten FILE_SHARE_DELETE så får andra processer ta bort eller byta namn på filen du har öppen.

Sätter du biten FILE_SHARE_READ så får andra processer läsa filen. Det här kan vara bra t.ex. om du ändå bara ska läsa från filen, varför hindra andra processer att läsa den samtidigt?

Sätter du biten FILE_SHARE_WRITE får andra processer skriva filen medan du har den öppen.

Låset är aktivt tills att du stänger filen eller på något annat sätt släpper den (t.e.x. att processen som hade filen öppen avslutas.)

Med det känner jag att jag beskrivit lite hur API:t i sig fungerar. Motsvarande flaggor kan du ofta även användra i andra API:er i högre nivå-språk, t.ex. så kan du styra de flaggorna när du använder metoden System.IO.File.Open i .NET med rätt overload där du kan skicka med en FileShare-parameter.

Är det det svaret du är ute efter?

Permalänk
Medlem
Skrivet av pv2b:

Hej!

Till att börja med så fungerar fillåsning på helt olika sätt på Windows och Linux. På Linux så används i normalfallet "advisory lock" vilket i princip innebär att filerna inte är låsta "på riktigt", utan om två processer vet med sig att det kan bli kaos om båda skriver mot samma fil så kan de använda ett "advisory lock" som är ett API som tillåter två processer att skapa "frivilliga" lås på filen så att det inte blir kaos. Linux har inte längre stöd för mandatory lock sedan version v5.14, och även innan dess så avrådde man från att använda funktionen av olika anledningar, men främst för att implementationen inte var helt perfekt och kunde hänga OS:et...

Men nog om Linux, vi fokar på Windows för det är den forumdelen du är i, och det du vart inne och grävt mest i verkar det som. Det är bara bra att känna till att Windows har mandatory locks, vilket Linux inte har.

På Windows däremot så finns det på filsystem/OS-nivå "mandatory locking" som fungerar mycket bättre, och precis som du är inne på används av office-paketet, som låser filerna på OS-nivå när man öppnar dem. Det funkar även över SMB-fileshares, men om du kör DFS-R-replikering på dina shares så replikeras inte lås över till andra filservrar. Detta p.g.a. att det skulle skapa orimligt mycket latens när man vill ta ett lås. Om du inte vet om du kör DFS-R-replikering kan jag lugna dig med att, det gör du antagligen inte.

(Prova gärna, testa öppna cmd och kör "type" på ett word-dokument. Du kommer få skräp i terminalen som visar att filen går läsa, även om det inte är särskilt läsbart att dumpa ut råa datat i terminalen. Prova sedan öppna dokumentet igen och kör "type" igen, så kommer du se att filen används av en annan process (d.v.s. Word!))

Precis som du hittat så är det parametern dwShareMode till CreateFileA som låter dig välja hur du vill låsa filen.

För att översätta till ren svenska, om du sätter denna till 0 så får inga andra processer göra något med filen medan du har den öppen. Parametern är ett bitfält och du kan välja att ge andra processer mer behörigheter.

Sätter du biten FILE_SHARE_DELETE så får andra processer ta bort eller byta namn på filen du har öppen.

Sätter du biten FILE_SHARE_READ så får andra processer läsa filen. Det här kan vara bra t.ex. om du ändå bara ska läsa från filen, varför hindra andra processer att läsa den samtidigt?

Sätter du biten FILE_SHARE_WRITE får andra processer skriva filen medan du har den öppen.

Låset är aktivt tills att du stänger filen eller på något annat sätt släpper den (t.e.x. att processen som hade filen öppen avslutas.)

Med det känner jag att jag beskrivit lite hur API:t i sig fungerar. Motsvarande flaggor kan du ofta även användra i andra API:er i högre nivå-språk, t.ex. så kan du styra de flaggorna när du använder metoden System.IO.File.Open i .NET med rätt overload där du kan skicka med en FileShare-parameter.

Är det det svaret du är ute efter?

Tack! Ja det var det, och härligt att du med med Linux med då jag är intresserad av båda systemen.

Så, jag kan bara använda API:n när jag skriver det i ett programmering språk då alltså? Kan man ändra detta i typ regedit efterhand?

Skönt att du även tog med "mandatory locking" så fick jag lite mer förståelse för det också för jag var lite osäker där. Så detta är alltså sammanfattat som sin "egna" del av teknik då alltså?

Jag var även inne på DFS och det är som du säger, den känner inte igen andra lås förutom sin egen filserver, det är faktiskt väldigt bra information som du även tog med som jag uppskattar.

Permalänk
Medlem
Skrivet av slowqa:

Så, jag kan bara använda API:n när jag skriver det i ett programmering språk då alltså? Kan man ändra detta i typ regedit efterhand?

Ändra vad i efterhand? Hur en fil är öppnad av en körande process? Det är inte rimligt att göra. Rent teoretiskt går det så klart om man manipulerar kärnans datastruktur som håller informationen om hur filen är öppnad. Hur filen ska öppnas bestäms typiskt av programmets interna logik och är inget en annan process ska manipulera (men kanske förhålla sig till). Så ja, hur filen är öppnad är något som bestäms av API:et som används för att öppna filen.

Permalänk
Hedersmedlem
Skrivet av slowqa:

Tack! Ja det var det, och härligt att du med med Linux med då jag är intresserad av båda systemen.

Så, jag kan bara använda API:n när jag skriver det i ett programmering språk då alltså? Kan man ändra detta i typ regedit efterhand?

Exakt, om du skriver ett program kan du som programmerare välja att ta ett lås på filen, eller om du låter andra program jobba med filen samtidigt. Oftast så är de här flaggorna hårdkodade i själva programmet och slutanvändaren har inget sätt att ändra på detta. Teoretiskt skulle ju någon kunna skriva ett program där man kan ställa in sharinginställningarna via en registernyckel men det är inte det normala.

Om du vill ändra hur ett program öppnar sina filer skulle du alltså behöva göra något av följande:

1. Ändra programmets källkod och kompilera om (förutsatt att du har källkoden)
2. Patcha programmets maskinkod (kräver kunskaper inom assembler)
3. Shimma en någon slags debugger eller förladdat bibliotek eller filsystemsfilter eller liknande som lägger sig mellan operativsystemet och applikationen.

Förmodligen vill du inte göra detta.

Skrivet av slowqa:

Skönt att du även tog med "mandatory locking" så fick jag lite mer förståelse för det också för jag var lite osäker där. Så detta är alltså sammanfattat som sin "egna" del av teknik då alltså?

Skillnaden mellan "mandatory locking" som bl.a. finns i Windows och "advisory locking" som bl.a. finns på Linux är att på Windows så är låset tvingande. D.v.s. om ett program tar ett lås kan du inte (med normala sätt) gå förbi låset, utan alla program påverkas.

Med "advisory locking" måste programmet själv kolla om filen är "låst" först, men det påverkar inte ett program som inte kollar lås (de flesta). Det här är användbart främst när man har ett eller flera program man vet jobbar med samma filer och vill koordinera dem så att de inte råkar öppna samma fil samtidigt, men det utgår alltså från att alla program samarbetar.

Självklart finns det fler plattformar än bara Windows och Linux på marknaden, och olika plattformar kan ha stöd för olika sorters lås, så det är inte direkt korrekt att säga att Mandatory Locking bara är en MS-grej, för det har t.ex. funnits stöd för det i tidigare Linux-versioner och säkert i andra OS.

Permalänk
Medlem
Skrivet av pv2b:

Exakt, om du skriver ett program kan du som programmerare välja att ta ett lås på filen, eller om du låter andra program jobba med filen samtidigt. Oftast så är de här flaggorna hårdkodade i själva programmet och slutanvändaren har inget sätt att ändra på detta. Teoretiskt skulle ju någon kunna skriva ett program där man kan ställa in sharinginställningarna via en registernyckel men det är inte det normala.

Om du vill ändra hur ett program öppnar sina filer skulle du alltså behöva göra något av följande:

1. Ändra programmets källkod och kompilera om (förutsatt att du har källkoden)
2. Patcha programmets maskinkod (kräver kunskaper inom assembler)
3. Shimma en någon slags debugger eller förladdat bibliotek eller filsystemsfilter eller liknande som lägger sig mellan operativsystemet och applikationen.

Förmodligen vill du inte göra detta.

Skillnaden mellan "mandatory locking" som bl.a. finns i Windows och "advisory locking" som bl.a. finns på Linux är att på Windows så är låset tvingande. D.v.s. om ett program tar ett lås kan du inte (med normala sätt) gå förbi låset, utan alla program påverkas.

Med "advisory locking" måste programmet själv kolla om filen är "låst" först, men det påverkar inte ett program som inte kollar lås (de flesta). Det här är användbart främst när man har ett eller flera program man vet jobbar med samma filer och vill koordinera dem så att de inte råkar öppna samma fil samtidigt, men det utgår alltså från att alla program samarbetar.

Självklart finns det fler plattformar än bara Windows och Linux på marknaden, och olika plattformar kan ha stöd för olika sorters lås, så det är inte direkt korrekt att säga att Mandatory Locking bara är en MS-grej, för det har t.ex. funnits stöd för det i tidigare Linux-versioner och säkert i andra OS.

Tack! Håller på och lära mig mer om Windows och Linux lite mer på djupet så detta förklarar väldigt mycket om mekanismen som är lite djupare på båda OS. Fortfarande väldigt ny till allt men roligt och lära sig. Varför jag undra är för jag jobbade som 1-line tekniker för ungefär 2 år sen innan jag sa upp mig för att börja studera, då var detta ett problem de oftast ringde om flera gånger när de försökte öppna gemensamma filar på ett delat nätverk. Så jag har alltid undrat vart det ligger och hur det fungerar så roligt att få lära sig lite mer om det. Och tack för all hjälp och förstå mig mer på det teoretiska!