linux - Sletning af en fil med I/O i gang: Er det et filsystem og/eller en OS-funktion?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver et shell script, der kører på Linux, men kan fungere på filer, der sidder på en monteret partition,



  1. der måske eller ikke har et ext * fil-system. Det kunne fx være NTFS, FAT32 eller et hvilket som helst inode- eller ikke-inodebaseret system;

  2. der kunne blive yderligere re-monteret på andre kasser, der kører ikke Linux-operativsystemer som Windows eller Mac.



Desuden skal mit script kunne slette en fil på denne delte, vilkårligt formaterede partition (selvom filen er læst fra eller skrevet til) af en fjernproces, der kører på Linux-, Windows- eller Mac-bokse


Spørgsmål:



  1. Er evnen til at kunne slette en fil i brug en funktion af,


    en. kun filsystemet?


    b. eller kun operativsystemet?


    c. eller en kombination af begge dele?

  2. (Udvidelse af Q1) Er det ligegyldigt, om processen gør I/O på filen, og den, der sletter filen, er både lokal eller fjernbetjening?


Bedste reference



  Er det ligegyldigt, om processerne laver I/O på filen og den ene
  Sletning af filen er både lokal eller fjernbetjening?



interessant - hvordan fjernsystem kan få adgang til fil (åben, læs-skrive data, slet) på windows direkte ? virkelig dette umuligt. Vi har brug for nogle agenter (LANMan server), der kører i det lokale system, som vil blive af fjernkommandoer (send say by Network Redirector) gør lokale operationer på filen. så fra filsystemvisning - alle operationer altid lokale . [8]



  Er evnen til at kunne slette en fil i brug en funktion af



Dette implementeres selvfølgelig af filsystemdriveren, men denne driver er skrevet til konkret OS og baseret på det regler. mens filsystemdata på disken har fælles format (som resultatdrevformaterede (og skriftlige filer) i et operativsystem kan læses fra et andet operativsystem) - hvordan filsystemdriverens procesanmodninger åbner, læser, skriver, sletter filer - dette er OS specifikke. forskellig for forskellige operativsystemer. baseret på det regler. så datformat på disk er almindeligt og afhænger kun af filsystemet. men hvordan disse data læser/skriver/sletter - allerede os specifikke.


I Windows har vi følgende regler for slette filer: [9]



  Normalt er en fil, der er markeret til sletning, slet ikke slettet, før alle
  Åbn håndtag til filen er lukket, og linket tæller for
  filen er nul. Når du markerer en fil til sletning ved hjælp af
   FILE\_DISPOSITION\_POSIX\_SEMANTICS , linket bliver fjernet fra
  synligt navneområde, så snart POSIX slettehåndtaget er lukket,
  men filens datastrømme forbliver tilgængelige af andre eksisterende
  håndterer, indtil det sidste håndtag er lukket.



så generelt vil filen ikke blive slettet, indtil det sidste håndtag til det bliver lukket. filen blev ikke tilgængelig, efter vi har forsøgt at slette den - kan ikke mere åbne den (vi får fejl Der er blevet anmodet om en ikke-nærliggende handling af et filobjekt med en sletning i afventning. at slette). men hvis filen allerede var åbnet - kan vi stadig arbejde med det ved dette håndtag. også filen kan ikke slettes hvis der findes en del på filen - vil være fejl Der er gjort forsøg på at fjerne en fil eller en mappe, der ikke kan slettes.


start fra win10 redstone1 build exist FILE\_DISPOSITION\_POSIX\_SEMANTICS flag, der lader fjernet filnavn fra det synlige navneområde, når slettehåndtaget er lukket, men filens datastrømme forbliver tilgængelige med andre eksisterende håndtag, indtil det sidste håndtag er lukket


Windows code test demo: ( FILE\_DISPOSITION\_POSIX\_SEMANTICS understøttet af ntfs begynder kun fra \_WIN32\_WINNT\_WIN10\_RS1. FileDispositionInfoEx informationsklasse understøttes kun fra \_WIN32\_WINNT\_WIN10\_RS1. ikke implementeret fejl )


void print\_error(PCSTR name)
{
    PWSTR sz;
    NTSTATUS status = RtlGetLastNtStatus();
    if (FormatMessageW(FORMAT\_MESSAGE\_ALLOCATE\_BUFFER|FORMAT\_MESSAGE\_FROM\_HMODULE, 
        GetModuleHandle(L"ntdll"), status, 0, (PWSTR)&sz, 0, 0))
    {
        DbgPrint("\%s=\%x
\%S
", name, status, sz);
        LocalFree(sz);
    }
}

HANDLE OpenFile(PCWSTR lpFileName, DWORD dwDesiredAccess)
{
    HANDLE hFile = CreateFileW(lpFileName, dwDesiredAccess, FILE\_SHARE\_VALID\_FLAGS, 0, OPEN\_EXISTING, 0, 0);

    if (hFile == INVALID\_HANDLE\_VALUE)
    {
        print\_error("OpenFile");
        return 0;
    }

    return hFile;
}

void ReadTest(HANDLE hFile)
{
    if (hFile)
    {
        ULONG dwBytes;
        if (ReadFile(hFile, &dwBytes, sizeof(dwBytes), &dwBytes, 0))
        {
            DbgPrint("ReadFile=OK
");
        }
        else
        {
            print\_error("ReadFile");
        }
    }
}

void DeleteTest(PCWSTR lpFileName)
{
    HANDLE hFile1, hFile2, hFile3;

    if (hFile1 = OpenFile(lpFileName, DELETE))
    {
        hFile2 = OpenFile(lpFileName, FILE\_GENERIC\_READ);

        FILE\_DISPOSITION\_INFO\_EX fdi = { FILE\_DISPOSITION\_DELETE | FILE\_DISPOSITION\_POSIX\_SEMANTICS };
        if (!SetFileInformationByHandle(hFile1, FileDispositionInfoEx, &fdi, sizeof(fdi)))
        {
            print\_error("SetFileInformationByHandle");
        }

        // file already not accessible here (open must fail) but visible
        if (hFile3 = OpenFile(lpFileName, FILE\_GENERIC\_READ))
        {
            CloseHandle(hFile3);
        }

        ReadTest(hFile2);

        // win10 rs1: file removed from the visible namespace here
        CloseHandle(hFile1);

        // are file still visible ?
        if (hFile3 = OpenFile(lpFileName, FILE\_GENERIC\_READ))
        {
            CloseHandle(hFile3);
        }

        // are possible create new file with this name &
        hFile3 = CreateFileW(lpFileName, DELETE, 
            FILE\_SHARE\_VALID\_FLAGS, 0, CREATE\_NEW, FILE\_FLAG\_DELETE\_ON\_CLOSE, 0);
        if (hFile3 == INVALID\_HANDLE\_VALUE)
        {
            print\_error("CreateFile");
        }
        else
        {
            CloseHandle(hFile3);
            DbgPrint("CreateFile OK
");
        }

        ReadTest(hFile2);

        if (hFile2)
        {
            CloseHandle(hFile2);
        }
    }
}


og output


OpenFile=c0000056
A non close operation has been requested of a file object with a delete pending.

ReadFile=OK
OpenFile=c0000034
Object Name not found.

CreateFile OK
ReadFile=OK

Andre referencer 1


det afhænger af, hvordan du definerer filsystem og OS. Generelt forstår jeg under filsystem, hvordan datalagringen er organiseret på en enhed. OS er så ansvarlig for I/O data og filer. Især, hvis dit script ønsker at slette en fil, kalder det noget værktøj som rm og giver navnet på filen. Dette værktøj er et program, der gør et passende systemopkald. Dette systemopkald er en del af operativsystemet, der udføres i den privilegerede tilstand. Det forstår hvad og hvordan man skal gøre (f.eks. Hvilke drivere skal bruges til at markere HDD-blokke som gratis på et bestemt drev, eller måske skal nogle fjernprocedurer kaldes eller samba-server involveret osv.)
Så for at svare på dit spørgsmål 1, ville jeg have en tendens til at svare b.