Unix filtyper - Unix file types
De syv standard Unix-filtypene er vanlige , katalog , symbolsk lenke , FIFO spesial , blokk spesial , tegnspesial og stikkontakt som definert av POSIX . Ulike OS-spesifikke implementeringer tillater flere typer enn hva POSIX krever (f.eks. Solaris- dører ). En filtype kan identifiseres ved ls -lkommandoen, som viser typen i det første tegnet i filsystemets tillatelsesfelt .
For vanlige filer , Unix ikke pålegge eller gi noen interne filstruktur; Derfor er deres struktur og tolkning helt avhengig av programvaren som bruker dem. Imidlertid kan filekommandoen brukes til å bestemme hvilken type data de inneholder.
Representasjoner
Numerisk
I statstrukturen lagres filtype og tillatelser ( modus ) sammen i et st_mode bitfelt , som har en størrelse på minst 12 bits (3 bits for å spesifisere typen blant de syv mulige filtypene; 9 bits for tillatelser) . Oppsettet for tillatelser er definert av POSIX til å være minst 9 bits, men resten er udefinert.
Etter konvensjon er modusen en 16-biters verdi skrevet ut som et sekssifret oktaltall uten et ledende null. Formatdelen opptar bly 4-bits (2 oktale sifre), og "010" ( 1000 i binær) står vanligvis for en vanlig fil. De neste 3 bitene (1 siffer) brukes vanligvis til setuid, setgid og klebrig . Den siste delen er allerede definert av POSIX for å inneholde tillatelsen. Et eksempel er "100644" for en typisk fil. Dette formatet kan sees blant annet i git , tjære og ar .
Filtypen kan testes ved hjelp av makroer som S_ISDIR. En slik sjekk utføres vanligvis ved å maskere modusen med S_IFMT(ofte det oktale tallet "170000" for bly 4 bits konvensjonen) og sjekke om resultatet stemmer overens S_IFDIR. S_IFMTer ikke et kjerne POSIX-konsept, men en X / Open System Interfaces (XSI) utvidelse; systemer som bare overholder POSIX kan bruke noen andre metoder.
Modusstreng
Ta for eksempel en linje i ls -lutgangen:
drwxr-xr-x 2 root root 0 Jan 1 1970 home
POSIX spesifiserer formatet på utdataene for det lange formatet ( -lalternativ). Spesielt blir det første feltet (før første mellomrom) kalt "filmodusstreng", og dets første tegn beskriver filtypen. Resten av denne strengen indikerer filtillatelsene .
Derfor er modusstrengen i eksemplet drwxr-xr-x: filtypen er d(katalog) og tillatelsene er rwxr-xr-x.
Eksempler på implementeringer
Den GNU coreutils versjon av lsbruker et anrop til filemode(), en glibc funksjon (eksponert i gnulib biblioteket) for å få den modus strengen.
FreeBSD bruker en enklere tilnærming, men tillater et mindre antall filtyper.
Vanlig fil
Vanlige filer dukker opp ls -lmed bindestrek-minus - i modusfeltet:
$ ls -l /etc/passwd -rw-r--r-- ... /etc/passwd
Katalog
Den vanligste spesialfilen er katalogen. Oppsettet til en katalogfil defineres av filsystemet som brukes. Siden flere filsystemer er tilgjengelige under Unix, både native og ikke-native, er det ingen katalogfiloppsett.
En katalog er merket med a dsom første bokstav i modusfeltet i utdata fra ls -dleller statf.eks
$ ls -dl / drwxr-xr-x 26 root root 4096 Sep 22 09:29 / $ stat / File: "/" Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 128 Links: 26 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) ...
Symbolsk lenke
En symbolsk lenke er en referanse til en annen fil. Denne spesielle filen lagres som en tekstlig fremstilling av den refererte filens bane (som betyr at destinasjonen kan være en relativ bane, eller kanskje ikke eksisterer i det hele tatt).
En symbolsk lenke er merket med en l(liten bokstav L) som første bokstav i modusstrengen, f.eks
lrwxrwxrwx ... termcap -> /usr/share/misc/termcap lrwxrwxrwx ... S03xinetd -> ../init.d/xinetd
FIFO (kalt pipe)
En av styrkene til Unix har alltid vært kommunikasjon mellom prosesser . Blant fasilitetene som tilbys av operativsystemet, er rør som kobler utgangen fra en prosess til inngangen til en annen. Dette er greit hvis begge prosessene eksisterer i samme overordnede prosessrom, startet av samme bruker, men det er omstendigheter der kommunikasjonsprosessene må bruke FIFOer, her referert til som navngitte rør . En slik omstendighet oppstår når prosessene må utføres under forskjellige brukernavn og tillatelser.
Navngitte rør er spesielle filer som kan finnes hvor som helst i filsystemet. De kan opprettes med kommandoen mkfifosom i mkfifo mypipe.
Et navngitt rør er merket med a psom første bokstav i modusstrengen, f.eks
prw-rw---- ... mypipe
Stikkontakt
En holder er en spesiell fil som brukes for interprosess-kommunikasjon , som muliggjør kommunikasjon mellom to prosesser. I tillegg til å sende data, kan prosesser sende filbeskrivelser over en Unix-domenesokkelforbindelse ved hjelp av sendmsg()og recvmsg()systemanrop.
I motsetning til navngitte rør som kun tillater ensrettet dataflyt, er stikkontakter fullt dupleks-kompatible .
En stikkontakt er merket med en ssom første bokstav i modusstrengen, f.eks
srwxrwxrwx /tmp/.X11-unix/X0
Enhetsfil (blokk, tegn)
I Unix håndteres nesten alle ting som filer og har en plassering i filsystemet, til og med maskinvareenheter som harddisker. Det store unntaket er nettverksenheter som ikke dukker opp i filsystemet, men håndteres separat.
Enhetsfiler brukes til å bruke tilgangsrettigheter til enhetene og til å styre operasjonene på filene til de aktuelle enhetsdriverne.
Unix skiller mellom karakterenheter og blokkeringsenheter. Skillet er omtrent som følger:
- Tegnenheter gir bare en seriell inngangsstrøm eller aksepterer en seriell strøm av utdata
- Blokkeringsenheter er tilfeldig tilgjengelig
Selv om for eksempel diskpartisjoner kan ha både karakterenheter som gir ubufret tilfeldig tilgang til blokker på partisjonen og blokkerer enheter som gir bufret tilfeldig tilgang til blokker på partisjonen.
En karakterenhet er merket med a csom første bokstav i modusstrengen. På samme måte er en blokkanordning merket med en b, f.eks
crw------- ... /dev/null brw-rw---- ... /dev/sda
Dør
En dør er en spesiell fil for kommunikasjon mellom prosesser mellom en klient og server, for øyeblikket kun implementert i Solaris .
En dør er merket med en D(store bokstaver) som første bokstav i modusstrengen, f.eks
Dr--r--r-- ... name_service_door