Systemsamtal

Stat System Call Linux-handledning

Stat System Call Linux-handledning

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:

#omfatta

Stat 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 rubrikfilen innehåller följande fält:

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;
;

Beskrivning:

  1. st_dev: Det är ID för den enhet där vår fil finns för närvarande.
  2. st_rdev: Det här fältet beskriver att en viss fil representerar en viss enhet.
  3. st_ino: Det är filens inodnummer eller serienummer. Eftersom det är ett indexnummer så bör det vara unikt för alla filer
  4. st_size: st_size är storleken på filen i byte.
  5. st_atime: Det är sista gången eller den senaste tidpunkten då filen öppnades.
  6. st_ctime: Det är den senaste tid då status eller behörighet för filen ändrades.
  7. st_mtime: Det är den senaste tiden då filen ändrades.
  8. st_blksstorlek: Detta fält ger den önskade blockstorleken för I / O-filsystem som kan variera från fil till fil.
  9. st_blocks: Det här fältet anger det totala antalet block i multiplar om 512 byte.
  10. st_nlink: Det här fältet visar det totala antalet hårda länkar.
  11. st_uid: Detta fält anger användar-ID.
  12. st_gid: Detta fält anger grupp-ID.
  13. 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 används så att du kan använda stat systemanrop. Rubrikfilen är standardinmatnings- / utdatabiblioteksfilen så att du kan använda printf eller scanf i din C-kod.

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.

Bästa Gamepad Mapping Apps för Linux
Om du gillar att spela spel på Linux med en gamepad istället för ett typiskt tangentbord och musinmatningssystem, finns det några användbara appar för...
Användbara verktyg för Linux-spelare
Om du gillar att spela spel på Linux är chansen att du kan ha använt appar och verktyg som Wine, Lutris och OBS Studio för att förbättra spelupplevels...
HD Remastered Games för Linux som aldrig tidigare hade en Linux-version
Många spelutvecklare och utgivare kommer med HD-remaster av gamla spel för att förlänga livstiden för franchisen, snälla fans som begär kompatibilitet...