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:
#inkludereStat 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
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:
- st_dev: Det er ID-en for enheten vi har filen vår for øyeblikket.
- st_rdev: Dette feltet beskriver at en bestemt fil representerer en bestemt enhet.
- st_ino: Det er inodenummeret eller serienummeret til filen. Siden det er et indeksnummer, bør det være unikt for alle filer
- st_size: st_size er størrelsen på filen i byte.
- st_atime: Det er siste gang eller den siste tiden da filen ble åpnet.
- st_ctime: Det er den siste tiden da statusen eller tillatelsene til filen ble endret.
- st_mtime: Det er den siste tiden da filen ble endret.
- st_blksize: Dette feltet gir den foretrukne blokkstørrelsen for I / O-filsystemet, som kan variere fra fil til fil.
- st_blocks: Dette feltet forteller det totale antall blokker i multipler på 512 byte.
- st_nlink: Dette feltet viser det totale antallet harde lenker.
- st_uid: Dette feltet indikerer bruker-ID.
- st_gid: Dette feltet indikerer gruppe-ID.
- 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
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.