Linux-systemopkald
Systemopkald leveret af linux-kernen eksponeres på C-programmeringssproget via glibc. Når der bruges et systemopkald, kommunikerer du til operativsystemet, og når du vender tilbage, kommunikerer operativsystemet til dig gennem de parametre, der returneres til systemopkaldsfunktioner (returværdier).
Stat-systemopkald:
Stat-systemopkald er et systemopkald i Linux for at kontrollere status for en fil, f.eks. For at kontrollere, hvornår filen blev åbnet. Systemopkaldet stat () returnerer faktisk filattributter. Filattributterne for en inode returneres grundlæggende af funktionen Stat (). En inode indeholder filens metadata. En inode indeholder: filtypen, filstørrelsen, da filen blev åbnet (ændret, slettet), der er tidsstempler, og stien til filen, bruger-id'et og gruppe-id'et, filens links og fysisk adresse på filindhold.
Vi kan sige, at inode indeholder alle de data, der kræves til stat () systemopkaldet, og det er indeksnummeret for filen, der gemmes i inodetabellen. Når du opretter en fil, oprettes der et inodenummer for den pågældende fil. Ved hjælp af stat systemopkald kan systemtabellerne vises.
Syntaks for C Stat-systemopkald:
For at bruge stat-systemopkaldet i C-programmeringssprog skal du medtage følgende headerfil:
#omfatteStat bruges til at få status på en fil. Syntaksen for C stat-systemopkald er muligvis ikke den samme for hvert operativsystem. I Linux er syntaksen for stat-systemopkald som følger:
int stat (const char * sti, struct stat * buf)Funktionens returtype i int, hvis funktionen udføres med succes, returneres 0, hvis der er fejl, -1 returneres.
Her const char * sti angiver filens navn. Hvis filstien er et symbolsk link, skal du angive linket i stedet for filnavnet.
Så i funktionen har vi en stat struktur hvor data eller oplysninger om filen er gemt, der bruger en markør med navnet buf, som sendes ind som parametreter og udfyldes under udførelsen af opkaldet og læses af brugeren efter opkaldet.
Stat struktur:
Den statstruktur, der er defineret 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'et for den enhed, hvor vi har vores fil i øjeblikket.
- st_rdev: Dette felt beskriver, at en bestemt fil repræsenterer en bestemt enhed.
- st_ino: Det er filens inode nummer eller serienummer. Da det er et indeksnummer, skal det være unikt for alle filer
- st_størrelse: st_size er størrelsen på filen i byte.
- st_atime: Det er sidste gang eller det seneste tidspunkt, hvor filen blev åbnet.
- st_ctime: Det er det seneste tidspunkt, hvor status eller tilladelser for filen blev ændret.
- st_mtime: Det er det seneste tidspunkt, hvor filen blev ændret.
- st_blksstørrelse: Dette felt giver den foretrukne blokstørrelse for I / O-filsystemet, som kan variere fra fil til fil.
- st_blocks: Dette felt fortæller det samlede antal blokke i multipla på 512 bytes.
- st_nlink: Dette felt fortæller det samlede antal hårde links.
- st_uid: Dette felt angiver bruger-ID'et.
- st_gid: Dette felt angiver gruppe-id'et.
- st_mode: Det angiver tilladelserne til filen, fortæller tilstande for en fil. Følgende er de flag, der skal defineres for st_mode-feltet:
Flag | Beskrivelse | Flagværdi |
---|---|---|
S_IFMT | En bitmask bruges til at få tilstandsværdien af en fil | 0170000 |
S_IFSOCK | En filkonstant i stikkontakten | 0140000 |
S_IFLINK | En filkonstant med symbolsk link | 0120000 |
S_IFREG | Filkonstant for almindelig fil | 0100000 |
S_IFBLK | Filkonstant for blokfil | 0060000 |
S_IFDIR | Filkonstant for katalogfil | 0040000 |
S_IFCHR | Filkonstant for tegnfil | 0020000 |
S_IFIFO | En filkonstant på fiveo | 0010000 |
S_ISUID | Indstil bruger-ID-bit | 0004000 |
S_ISGID | Indstil gruppe-id-bit | 0002000 |
S_ISVTX | Sticky bit, der angiver delt tekst | 0001000 |
S_IRWXU | Ejertilladelser (læs, skriv, udfør) | 00700 |
S_IRUSR | Læs tilladelser til ejeren | 00400 |
S_IWUSR | Skriv tilladelser til ejeren | 00200 |
S_IXUSR | Udfør tilladelser til ejeren | 00100 |
S_IRWXG | Gruppetilladelser (læs, skriv, udfør) | 00070 |
S_IRGRP | Læs tilladelser for gruppen | 00040 |
S_IWGRP | Skriv tilladelser til gruppe | 00020 |
S_IXGRP | Udfør tilladelser til gruppen | 00010 |
S_IRWXO | Tilladelser til andre (læs, skriv, udfør) | 00007 |
S_IROTH | Læs tilladelser for andre | 00004 |
S_IWOTH | Skriv tilladelser til andre | 00002 |
S_IXOTH | Udfør tilladelser til andre | 00001 |
Sådan bruges Stat-systemopkald:
Følgende eksempel viser, hvordan man bruger stat-systemopkald i C-programmeringssprog i Linux, Ubuntu.
EKSEMPEL 1:
I den følgende kode skal vi finde tilstanden til en fil:
KODE:
#omfatte#omfatte
int main ()
// markør til stat struct
struktur stat sfile;
// stat systemopkald
stat ("stat.c ", & sfile);
// adgang til st_mode (data medlem af stat struct)
printf ("st_mode =% o", sfile.st_mode);
returnere 0;
Kompilering og kørsel af programmet vender tilbage som nedenfor:
I denne kode har vi sendt navnet på filen i stat systemopkald og derefter markøren til stat struct, der er sfile. Markøren til stat struct bruges derefter til at få adgang til st_mode, som viser filens tilstand ved hjælp af printf-sætning.
Overskriftsfilen
EKSEMPEL 2:
I den følgende kode vil vi få oplysninger om filen ved hjælp af stat systemopkald:
KODE:
#omfatte#omfatte
#omfatte
#omfatte
ugyldigt sfile (char const filnavn []);
int main ()
ssize_t læse;
char * buffer = 0;
size_t buf_size = 0;
printf ("Indtast navnet på en fil, der skal kontrolleres: \ n");
læse = getline (& buffer, & buf_size, stdin);
hvis (læs <=0 )
printf ("getline mislykkedes \ n");
udgang (1);
hvis (buffer [read-1] == '\ n')
buffer [read-1] = 0;
int s = åben (buffer, O_RDONLY);
hvis (s == - 1)
printf ("Filen findes ikke \ n");
udgang (1);
andet
sfile (buffer);
fri (buffer);
returnere 0;
ugyldigt sfile (char const filnavn [])
struktur stat sfile;
hvis (stat (filnavn, & sfile) == - 1)
printf ("Der opstod en fejl \ n");
// Adgang til data medlemmer af 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", sfile.st_gid);
printf ("\ nFil st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nFil st_størrelse% ld \ n", sfile.st_størrelse);
printf ("\ nFil st_nlink% u \ n", (usigneret 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 ("\ nFiltilladelsesgruppe \ 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 ("\ nFiltilladelser Andet \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
printf ((sfile.st_mode & S_IXOTH)? "x":"-");
printf ("\ n");
PRODUKTION:
I ovenstående C-kode har vi indtastet filnavnet, og hvis filen ikke findes, stoppes eksekveringen af programmet. Dette demonstreres i følgende billede:
Hvis vores fil findes, kaldes funktionen sfile (n), hvor vi har sendt navnet på filen. Inde i funktionen har vi først og fremmest brugt Stat-systemopkald, hvis stat () returnerer -1, skal der e e enhver fejl, så en meddelelse udskrives, og eksekvering af programmet stoppes.
Derefter har vi i printf-sætningen brugt navnet på funktionen og prikskilleren til at få adgang til datamedlemmerne til stat struct.
Så for filtilstanden har vi adgang til st_modes makroer eller flag. Her bruges logisk og operator til at udskrive de respektive tilstande. Vi har kontrolleret for tilladelser til bruger, gruppe og andre for den angivne fil (filnavn indtastet af bruger).
Med dette kan du se, hvordan du bruger stat-systemopkaldet fra programmeringssprog C for at få oplysninger fra OS-kernen om filer. Hvis du har et spørgsmål, er du velkommen til at fortælle os det via kommentarsektionen.