Linux-systemsamtal
Systemanrop som tillhandahålls av Linux-kärnan exponeras i C-programmeringsspråket via glibc. När ett systemanrop används kommunicerar du med operativsystemet och när du återvänder kommunicerar operativsystemet till dig genom de parametrar som returneras till systemanropsfunktionerna (returvärden).
Stat-systemanrop:
Stat-systemanrop är ett systemanrop i Linux för att kontrollera status för en fil, t.ex. för att kontrollera när filen öppnades. Systemanropet stat () returnerar faktiskt filattribut. Filattributen för en inod returneras i princip av funktionen Stat (). En inod innehåller filens metadata. En inod innehåller: typen av fil, filens storlek, när filen öppnades (modifierades, raderades) som är tidsstämplar och sökvägen till filen, användar-ID och grupp-ID, filens länkar och fysisk adress för filinnehåll.
Vi kan säga att inode innehåller alla data som krävs för systemanropet stat () och att det är indexnumret för filen som sparas i inodtabellen. När du skapar en fil skapas ett inodenummer för den filen. Med hjälp av stat systemanrop kan systemtabellerna visas.
Syntax för C Stat-systemanrop:
För att använda stat-systemanropet i C-programmeringsspråk måste du inkludera följande rubrikfil:
#omfattaStat används för att få status för en fil. Syntaksen för C stat-systemanrop kanske inte är densamma för alla operativsystem. I Linux är syntaxen för statligt systemanrop följande:
int stat (const char * path, struct stat * buf)Funktionens returtyp i int, om funktionen körs framgångsrikt returneras 0 om det finns några fel, -1 kommer att returneras.
Här const char * sökväg anger namnet på filen. Om filvägen är en symbolisk länk måste du ange länken istället för filnamnet.
Sedan i funktionen har vi en statlig struktur där data eller information om filen lagras som använder en pekare med namnet buf, som skickas in som parametrar och fylls i under samtalet och läsas av användaren efter samtalet.
Statens struktur:
Den statliga strukturen som definieras 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;
;
Beskrivning:
- st_dev: Det är ID för den enhet där vår fil finns för närvarande.
- st_rdev: Det här fältet beskriver att en viss fil representerar en viss enhet.
- st_ino: Det är filens inodnummer eller serienummer. Eftersom det är ett indexnummer så bör det vara unikt för alla filer
- st_size: st_size är storleken på filen i byte.
- st_atime: Det är sista gången eller den senaste tidpunkten då filen öppnades.
- st_ctime: Det är den senaste tid då status eller behörighet för filen ändrades.
- st_mtime: Det är den senaste tiden då filen ändrades.
- st_blksstorlek: Detta fält ger den önskade blockstorleken för I / O-filsystem som kan variera från fil till fil.
- st_blocks: Det här fältet anger det totala antalet block i multiplar om 512 byte.
- st_nlink: Det här fältet visar det totala antalet hårda länkar.
- st_uid: Detta fält anger användar-ID.
- st_gid: Detta fält anger grupp-ID.
- st_mode: Det anger behörigheterna för filen, berättar lägena för en fil. Följande är flaggorna som ska definieras för fältet st_mode:
Flaggor | Beskrivning | Flaggvärde |
---|---|---|
S_IFMT | En bitmask som används för att få lägesvärde för en fil | 0170000 |
S_IFSOCK | En filkonstant för uttaget | 0140000 |
S_IFLINK | En filkonstant med symbolisk länk | 0120000 |
S_IFREG | Filkonstant för vanlig fil | 0100000 |
S_IFBLK | Filkonstant för blockfil | 0060000 |
S_IFDIR | Filkonstant för katalogfil | 0040000 |
S_IFCHR | Filkonstant för teckenfil | 0020000 |
S_IFIFO | En filkonstant på femo | 0010000 |
S_ISUID | Ställ in User ID-bit | 0004000 |
S_ISGID | Ställ in grupp-ID-bit | 0002000 |
S_ISVTX | Sticky bit som indikerar delad text | 0001000 |
S_IRWXU | Ägartillstånd (läs, skriv, kör) | 00700 |
S_IRUSR | Läs tillstånd för ägare | 00400 |
S_IWUSR | Skrivbehörigheter för ägaren | 00200 |
S_IXUSR | Kör behörigheter för ägaren | 00100 |
S_IRWXG | Grupptillstånd (läs, skriv, kör) | 00070 |
S_IRGRP | Läs behörigheter för grupp | 00040 |
S_IWGRP | Skrivbehörigheter för grupp | 00020 |
S_IXGRP | Kör behörigheter för gruppen | 00010 |
S_IRWXO | Behörigheter för andra (läs, skriv, kör) | 00007 |
S_IROTH | Läs behörigheter för andra | 00004 |
S_IWOTH | Skriv behörigheter för andra | 00002 |
S_IXOTH | Utför behörigheter för andra | 00001 |
Hur man använder Stat-systemanrop:
Följande exempel visar hur man använder stat-systemanrop i C-programmeringsspråk i Linux, Ubuntu.
EXEMPEL 1:
I följande kod kommer vi att hitta läget för en fil:
KODA:
#omfatta#omfatta
int main ()
// pekare till stat struct
struct stat sfile;
// stat systemanrop
stat ("stat.c ", & sfile);
// åtkomst till st_mode (datamedlem i stat struct)
printf ("st_mode =% o", sfile.st_mode);
returnera 0;
Kompilering och körning av programmet återgår enligt nedan:
I den här koden har vi skickat namnet på filen i stat systemanrop och sedan pekaren till stat struct som är sfile. Pekaren till stat-strukturen används sedan för att komma åt st_mode som visar filens läge med printf-uttalande.
Rubrikfilen
EXEMPEL 2:
I följande kod kommer vi att få information om filen med hjälp av stat systemanrop:
KODA:
#omfatta#omfatta
#omfatta
#omfatta
ogiltig sfile (char const filnamn []);
int main ()
ssize_t läs;
char * buffert = 0;
size_t buf_size = 0;
printf ("Ange namnet på en fil som ska kontrolleras: \ n");
läs = getline (& buffert, & buf_size, stdin);
if (läs <=0 )
printf ("getline misslyckades \ n");
utgång (1);
if (buffert [läs-1] == '\ n')
buffert [läs-1] = 0;
int s = öppen (buffert, O_RDONLY);
om (s == - 1)
printf ("Filen finns inte \ n");
utgång (1);
annan
sfile (buffert);
fri (buffert);
returnera 0;
ogiltig sfile (char const filnamn [])
struct stat sfile;
om (stat (filnamn, & sfile) == - 1)
printf ("Fel uppstod \ n");
// Åtkomst till datamedlemmar i stat struct
printf ("\ nFil st_uid% d \ n", sfile.st_uid);
printf ("\ nFil st_blksstorlek% 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_size% ld \ n", sfile.st_size);
printf ("\ nFil st_nlink% u \ n", (osignerad 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 ("\ nFilbehörighetsgrupp \ 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 ("\ nFilbehörigheter Övrigt \ 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 ovanstående C-kod har vi angett filnamnet och om filen inte finns kommer körningen av programmet att stoppas. Detta visas i följande bild:
Om vår fil finns kommer funktionen sfile (n) att kallas där vi har skickat filnamnet. Inne i funktionen har vi först och främst använt Stat-systemanrop, om stat () returnerar -1 så måste det finnas något fel så att ett meddelande kommer att skrivas ut och körningen av programmet kommer att stoppas.
Sedan har vi i printf-uttalandet använt funktionens namn och punktavgränsare för att komma åt datamedlemmarna till stat struct.
Sedan för filläget har vi öppnat makron eller flaggorna i st_mode. Här används logisk och operatör för att skriva ut respektive lägen. Vi har kontrollerat om behörigheter för användare, grupp och andra för den angivna filen (filnamn anges av användaren).
Med detta kan du se hur man använder stat-systemanropet från C-programmeringsspråket för att få information från OS-kärnan om filer. Om du har en fråga är du välkommen att berätta för oss via kommentarsektionen.