Systemanrop

Stat System Call Linux-veiledning

Stat System Call Linux-veiledning

Linux-systemanrop

Systemanrop fra Linux-kjernen blir eksponert i C-programmeringsspråket via glibc.  Når en systemanrop brukes, kommuniserer du til operativsystemet, og når du kommer tilbake, kommuniserer operativsystemet til deg gjennom parametrene som returneres til systemanropsfunksjoner (returverdier).

Stat System Call:

Stat systemanrop er et systemanrop i Linux for å kontrollere statusen til en fil, for eksempel for å sjekke når filen ble åpnet. Systemanropet stat () returnerer faktisk filattributter. Filattributtene til en inode returneres i utgangspunktet av Stat () -funksjonen. En inode inneholder metadata for filen. En inode inneholder: typen av fil, størrelsen på filen, da filen ble åpnet (endret, slettet) som er tidsstempler, og banen til filen, bruker-ID og gruppe-ID, koblinger til filen , og fysisk adresse til filinnhold.

Vi kan si at inode inneholder alle dataene som kreves for stat () systemanropet, og det er indeksnummeret for filen som er lagret i inodetabellen. Når du oppretter en fil, opprettes et inodenummer for den filen. Ved hjelp av stat systemanrop kan systemtabellene vises.

Syntaks for C Stat-systemanrop:

For å bruke stat-systemanropet i C-programmeringsspråk, må du inkludere følgende overskriftsfil:

#inkludere

Stat brukes til å få status på en fil. Syntaksen for C stat-systemanrop er kanskje ikke den samme for hvert operativsystem. I Linux er syntaksen for stat-systemanrop som følger:

int stat (const char * path, struct stat * buf)

Returtypen til funksjonen i int, hvis funksjonen er utført vellykket, returneres 0 hvis det er noen feil, -1 vil bli returnert.

Her const char * sti angir navnet på filen. Hvis filbanen er en symbolsk lenke, må du angi lenken i stedet for filnavnet.

Så i funksjonen har vi en stat struktur der dataene eller informasjonen om filen er lagret som bruker en peker som heter buf, som sendes inn som parametreter og fylles ut under utførelsen av samtalen og leses av brukeren etter samtalen.

Stat struktur:

Statstrukturen som er definert i header-fil inneholder følgende felt:

struct stat

mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;

Beskrivelse:

  1. st_dev: Det er ID-en for enheten vi har filen vår for øyeblikket.
  2. st_rdev: Dette feltet beskriver at en bestemt fil representerer en bestemt enhet.
  3. st_ino: Det er inodenummeret eller serienummeret til filen. Siden det er et indeksnummer, bør det være unikt for alle filer
  4. st_size: st_size er størrelsen på filen i byte.
  5. st_atime: Det er siste gang eller den siste tiden da filen ble åpnet.
  6. st_ctime: Det er den siste tiden da statusen eller tillatelsene til filen ble endret.
  7. st_mtime: Det er den siste tiden da filen ble endret.
  8. st_blksize: Dette feltet gir den foretrukne blokkstørrelsen for I / O-filsystemet, som kan variere fra fil til fil.
  9. st_blocks: Dette feltet forteller det totale antall blokker i multipler på 512 byte.
  10. st_nlink: Dette feltet viser det totale antallet harde lenker.
  11. st_uid: Dette feltet indikerer bruker-ID.
  12. st_gid: Dette feltet indikerer gruppe-ID.
  13. st_mode: Det indikerer tillatelsene til filen, forteller modusene på en fil. Følgende er flaggene som skal defineres for st_mode-feltet:
Flagg Beskrivelse Flagg Verdi
S_IFMT En bitmaske som brukes til å få modusverdien til en fil 0170000
S_IFSOCK En filkonstant med stikkontakt 0140000
S_IFLINK En filkonstant med symbolsk lenke 0120000
S_IFREG Filkonstant for vanlig fil 0100000
S_IFBLK Filkonstant for blokkfil 0060000
S_IFDIR Filkonstant for katalogfil 0040000
S_IFCHR Filkonstant for tegnfil 0020000
S_IFIFO En filkonstant på femo 0010000
S_ISUID Angi bruker-ID-bit 0004000
S_ISGID Sett gruppe-ID-bit 0002000
S_ISVTX Sticky bit som indikerer delt tekst 0001000
S_IRWXU Eiertillatelser (lese, skrive, utføre) 00700
S_IRUSR Les tillatelser for eier 00400
S_IWUSR Skriv tillatelser for eier 00200
S_IXUSR Utfør tillatelser for eieren 00100
S_IRWXG Gruppetillatelser (lese, skrive, utføre) 00070
S_IRGRP Les tillatelser for gruppen 00040
S_IWGRP Skriv tillatelser for gruppen 00020
S_IXGRP Utfør tillatelser for gruppen 00010
S_IRWXO Tillatelser for andre (lese, skrive, utføre) 00007
S_IROTH Les tillatelser for andre 00004
S_IWOTH Skriv tillatelser til andre 00002
S_IXOTH Utfør tillatelser for andre 00001

Hvordan bruke Stat systemanrop:

Følgende eksempel viser hvordan du bruker stat systemanrop i C programmeringsspråk i Linux, Ubuntu.

EKSEMPEL 1:

I den følgende koden skal vi finne modusen til en fil:

KODE:

#inkludere
#inkludere
int main ()

// peker til stat struct
struktur stat sfile;
// stat systemanrop
stat ("stat.c ", & sfile);
// tilgang til st_mode (data medlem av stat struct)
printf ("st_mode =% o", sfile.st_mode);
retur 0;

Kompilering og kjøring av programmet returnerer som nedenfor:

I denne koden har vi sendt navnet på filen i stat systemanrop og deretter pekeren til stat struct som er sfile. Pekeren til stat struct brukes deretter til å få tilgang til st_mode som viser filens modus ved hjelp av printf statement.

Overskriftsfilen brukes slik at du kan bruke stat systemanrop. Overskriftsfilen er standard input / output biblioteksfil slik at du kan bruke printf eller scanf i C-koden.

EKSEMPEL 2:

I den følgende koden skal vi få informasjon om filen ved hjelp av stat systemanrop:

KODE:

#inkludere
#inkludere
#inkludere
#inkludere
ugyldig sfile (char const filnavn []);
int main ()
ssize_t lese;
char * buffer = 0;
size_t buf_size = 0;
printf ("Skriv inn navnet på en fil som skal kontrolleres: \ n");
les = getline (& buffer, & buf_size, stdin);
hvis (les <=0 )
printf ("getline mislyktes \ n");
utgang (1);

hvis (buffer [read-1] == '\ n')
buffer [read-1] = 0;

int s = åpen (buffer, O_RDONLY);
hvis (s == - 1)
printf ("Filen eksisterer ikke \ n");
utgang (1);

ellers
sfile (buffer);

gratis (buffer);
retur 0;

ugyldig sfile (char const filnavn [])
struktur stat sfile;
hvis (stat (filnavn, & sfile) == - 1)
printf ("Feil oppstod \ n");

// Tilgang til data medlemmer av stat struct
printf ("\ nFil st_uid% d \ n", sfile.st_uid);
printf ("\ nFil st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFil st_gid% d \ n", fil.st_gid);
printf ("\ nFile st_blocks% ld \ n", sfile.st_blokker);
printf ("\ nFil st_size% ld \ n", sfile.st_size);
printf ("\ nFil st_nlink% u \ n", (usignert int) sfile.st_nlink);
printf ("\ nFile Permissions User \ n");
printf ((sfile.st_mode & S_IRUSR)? "r": "-");
printf ((sfile.st_mode & S_IWUSR)? "w": "-");
printf ((sfile.st_mode & S_IXUSR)? "x": "-");
printf ("\ n");
printf ("\ nFile Permissions Group \ n");
printf ((sfile.st_mode & S_IRGRP)? "r": "-");
printf ((sfile.st_mode & S_IWGRP)? "w": "-");
printf ((sfile.st_mode & S_IXGRP)? "x": "-");
printf ("\ n");
printf ("\ nFile Permissions Other \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
printf ((sfile.st_mode & S_IXOTH)? "x": "-");
printf ("\ n");

PRODUKSJON:

I C-koden ovenfor har vi angitt navnet på filen, og hvis filen ikke eksisterer, vil kjøringen av programmet bli stoppet. Dette vises i følgende bilde:

Hvis filen vår eksisterer, blir funksjonen sfile (n) kalt der vi har sendt navnet på filen. Inne i funksjonen, først og fremst har vi brukt Stat systemanrop, hvis stat () returnerer -1 så må det e noen feil så en melding blir skrevet ut og utførelsen av programmet vil bli stoppet.

Så i printf uttalelse har vi brukt navnet på funksjonen og prikkeskilleren for å få tilgang til data medlemmene av stat struct.

Så for filmodusen har vi fått tilgang til makroene eller flaggene til st_mode. Her brukes logisk og operatør til å skrive ut de respektive modusene. Vi har sjekket for tillatelser for bruker, gruppe og andre for den angitte filen (filnavn angitt av bruker).

Med dette kan du se hvordan du bruker stat-systemanropet fra C-programmeringsspråket for å få informasjon fra OS-kjernen om filer.  Hvis du har spørsmål, kan du fortelle oss det via kommentarseksjonen.

Hvordan installere og spille Doom på Linux
Introduksjon til Doom Doom-serien stammer fra 90-tallet etter utgivelsen av den originale Doom. Det ble en øyeblikkelig suksess, og fra den tiden og u...
Vulkan for Linux-brukere
Med hver nye generasjon grafikkort ser vi spillutviklere skyve grensene for grafisk troskap og komme et skritt nærmere fotorealisme. Men til tross for...
OpenTTD vs Simutrans
Å lage din egen transportsimulering kan være morsom, avslappende og ekstremt fristende. Derfor må du sørge for at du prøver så mange spill som mulig f...