Wywołania systemowe dostarczane przez jądro Linuksa są udostępniane w języku programowania C za pośrednictwem glibc. Gdy używane jest wywołanie systemowe, użytkownik komunikuje się z systemem operacyjnym, a po powrocie system operacyjny komunikuje się z użytkownikiem za pośrednictwem parametrów zwracanych do funkcji wywołań systemowych (wartości zwracane).
Wywołanie systemowe statystyk:
Wywołanie systemowe Stat to wywołanie systemowe w Linuksie, które sprawdza stan pliku, na przykład sprawdza, kiedy plik był dostępny. Wywołanie systemowe stat() faktycznie zwraca atrybuty pliku. Atrybuty pliku i-węzła są zasadniczo zwracane przez funkcję Stat(). I-węzeł zawiera metadane pliku. I-węzeł zawiera: typ pliku, rozmiar pliku, kiedy plik był dostępny (zmodyfikowany, usunięty), czyli znaczniki czasu i ścieżkę do pliku, identyfikator użytkownika i identyfikator grupy, linki do pliku oraz fizyczny adres zawartości pliku.
Można powiedzieć, że i-węzeł zawiera wszystkie dane wymagane do wywołania systemowego stat() i jest to numer indeksu pliku, który jest zapisany w tablicy i-węzłów. Za każdym razem, gdy tworzysz plik, tworzony jest numer i-węzła dla tego pliku. Za pomocą wywołania systemowego stat można przeglądać tabele systemowe.
Składnia wywołania systemowego C Stat:
Aby użyć wywołania systemowego stat w języku programowania C, musisz dołączyć następujący plik nagłówkowy:
#włączać
Stat służy do uzyskiwania statusu pliku. Składnia wywołania systemowego C stat może nie być taka sama dla każdego systemu operacyjnego. W Linuksie składnia wywołania systemowego stat jest następująca:
intstan(stały zwęglać *ścieżka, strukturastan*bufia)
Zwracany typ funkcji w int, jeśli funkcja zostanie wykonana pomyślnie, zwracane jest 0, jeśli występują błędy, zwracane jest -1.
Tutaj const char *ścieżka określa nazwę pliku. Jeśli ścieżka pliku jest dowiązaniem symbolicznym, musisz określić dowiązanie zamiast nazwy pliku.
Następnie w funkcji mamy strukturę stat, w której przechowywane są dane lub informacje o pliku, która używa wskaźnika o nazwie buf, który jest przekazywany jako parametr i wypełniany w trakcie wykonywania wywołania i odczytywany przez użytkownika po wywołaniu.
Struktura statystyk:
Struktura statystyk zdefiniowana w pliku nagłówkowym zawiera następujące pola:
strukturastan{
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_tst_rozmiar;
strukturatimspec st_atim;
strukturatimspec st_mtim;
strukturatimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
Opis:
- st_dev: Jest to identyfikator urządzenia, w którym aktualnie znajduje się nasz plik.
- st_rdev: To pole opisuje, że określony plik reprezentuje określone urządzenie.
- st_ino: Jest to numer i-węzła lub numer seryjny pliku. Ponieważ jest to numer indeksu, powinien być unikalny dla wszystkich plików
- st_rozmiar: st_size to rozmiar pliku w bajtach.
- godzina_w: Jest to ostatni lub ostatni czas dostępu do pliku.
- st_ctime: Jest to ostatnia godzina zmiany statusu lub uprawnień pliku.
- st_mtime: Jest to ostatnia godzina modyfikacji pliku.
- st_blksize: To pole podaje preferowany rozmiar bloku dla systemu plików we/wy, który może się różnić w zależności od pliku.
- st_blocks: To pole podaje całkowitą liczbę bloków w wielokrotności 512 bajtów.
- st_nlink: To pole informuje o całkowitej liczbie twardych łączy.
- st_uid: To pole wskazuje identyfikator użytkownika.
- st_gid: To pole wskazuje identyfikator grupy.
- st_mode: Wskazuje uprawnienia do pliku, informuje o trybach pliku. Poniżej znajdują się flagi, które powinny być zdefiniowane dla pola st_mode:
Flagi | Opis | Wartość flagi |
---|---|---|
S_IFMT | Maska bitowa używana do uzyskania wartości trybu pliku | 0170000 |
S_IFSOCK | Stała pliku gniazda | 0140000 |
S_IFLINK | Stała pliku dowiązania symbolicznego | 0120000 |
S_IFREG | Stała pliku dla zwykłego pliku | 0100000 |
S_IFBLK | Stała pliku dla pliku blokowego | 0060000 |
S_IFDIR | Stała pliku dla pliku katalogu | 0040000 |
S_IFCHR | Stała pliku dla pliku znakowego | 0020000 |
S_IFIFO | Stała pliku fifo | 0010000 |
S_ISUID | Ustaw bit identyfikatora użytkownika | 0004000 |
S_ISGID | Ustaw bit identyfikatora grupy | 0002000 |
S_ISVTX | Lepki bit, który wskazuje udostępniony tekst | 0001000 |
S_IRWXU | Uprawnienia właściciela (odczyt, zapis, wykonanie) | 00700 |
S_IRUSR | Uprawnienia do odczytu dla właściciela | 00400 |
S_IWUSR | Uprawnienia do zapisu dla właściciela | 00200 |
S_IXUSR | Wykonywanie uprawnień dla właściciela | 00100 |
S_IRWXG | Uprawnienia grupowe (odczyt, zapis, wykonanie) | 00070 |
S_IRGRP | Uprawnienia do odczytu dla grupy | 00040 |
S_IWGRP | Uprawnienia zapisu dla grupy | 00020 |
S_IXGRP | Wykonaj uprawnienia dla grupy | 00010 |
S_IRWXO | Uprawnienia dla innych (odczyt, zapis, wykonanie) | 00007 |
S_IROTH | Czytaj uprawnienia dla innych | 00004 |
S_IWOTH | Uprawnienia do zapisu dla innych | 00002 |
S_IXOTH | Wykonywanie uprawnień dla innych | 00001 |
Jak korzystać z wywołania systemowego Stat:
Poniższy przykład pokazuje, jak używać wywołania systemowego stat w języku programowania C w systemie Linux, Ubuntu.
PRZYKŁAD 1:
W poniższym kodzie znajdziemy tryb pliku:
KOD:
#włączać#włączać
intGłówny()
{
//wskaźnik do struktury stat
strukturaplik stanu;
//stat wywołanie systemowe
stan(„stat.c”, &sfile);
//dostęp do st_mode (element danych struktury stat)
printf ('st_mode = %o',plik.st_mode);
powrót 0;
}
Kompilacja i uruchomienie programu powraca jak poniżej:
W tym kodzie przekazaliśmy nazwę pliku w wywołaniu systemowym stat, a następnie wskaźnik do struktury stat, którą jest sfile. Wskaźnik do struktury stat jest następnie używany do uzyskania dostępu do trybu st_mode, który wyświetla tryb pliku za pomocą instrukcji printf.
Używany jest plik nagłówkowy, więc możesz użyć wywołania systemowego stat. Plik nagłówkowy jest standardowym plikiem biblioteki wejścia/wyjścia, dzięki czemu możesz używać printf lub scanf w kodzie C.
PRZYKŁAD 2:
W poniższym kodzie uzyskamy informacje o pliku za pomocą wywołania systemowego stat:
KOD:
#włączać#włączać
#włączać
#włączać
próżniasfile(zwęglać stałyNazwa pliku[]);
intGłówny(){
rozmiar_t przeczytaj;
zwęglać*bufor= 0;
rozmiar_tbuf_size= 0;
printf ('Wprowadź nazwę pliku do sprawdzenia: ');
czytać=getline(&bufor, &buf_size,stdin);
Jeśli (czytać<=0 ){
printf („getline nie powiodło się” ');
Wyjście (1);
}
Jeśli (bufor[czytać-1] == ' '){
bufor[czytać-1] = 0;
}
ints=otwarty(bufor,O_RDONLY);
Jeśli(s== -1){
printf („Plik nie istnieje” ');
Wyjście (1);
}
w przeciwnym razie{
sfile(bufor);
}
darmowy (bufor);
powrót 0;
}
próżniasfile(zwęglać stałyNazwa pliku[]){
strukturaplik stanu;
Jeśli(stan(Nazwa pliku, &sfile)== -1){
printf ('Wystąpił błąd ');
}
//Uzyskiwanie dostępu do członków danych struktury stat
printf (' Plik st_uid %d ',plik.st_uid);
printf (' Plik st_blksize %ld ',plik.st_blksize);
printf (' Plik st_gid %d ',plik.st_gid);
printf (' Plik st_blocks %ld ',plik.st_blocks);
printf (' Plik st_size %ld ',plik.st_rozmiar);
printf (' Plik st_nlink% u ',(bez znaku int)plik.st_nlink);
printf (' Uprawnienia plików Użytkownik ');
printf ((plik.st_mode &S_IRUSR)? 'r':„-”);
printf ((plik.st_mode &S_IWUSR)? 'w':„-”);
printf ((plik.st_mode &S_IXUSR)? 'x':„-”);
printf (' ');
printf (' Grupa uprawnień do plików ');
printf ((plik.st_mode &S_IRGRP)? 'r':„-”);
printf ((plik.st_mode &S_IWGRP)? 'w':„-”);
printf ((plik.st_mode &S_IXGRP)? 'x':„-”);
printf (' ');
printf (' Uprawnienia do plików Inne ');
printf ((plik.st_mode &S_IROTH)? 'r':„-”);
printf ((plik.st_mode &S_IWOTH)? 'w':„-”);
printf ((plik.st_mode &S_IXOTH)? 'x':„-”);
printf (' ');
}
WYJŚCIE:
W powyższym kodzie C wpisaliśmy nazwę pliku i jeśli plik nie istnieje to wykonanie programu zostanie zatrzymane. Widać to na poniższym obrazku:
Jeśli nasz plik istnieje, zostanie wywołana funkcja sfile(n), w której przekazaliśmy nazwę pliku. Wewnątrz funkcji przede wszystkim użyliśmy wywołania systemowego Stat, jeśli stat() zwróci -1 to musi być jakiś błąd, aby komunikat został wydrukowany i wykonywanie programu zostało zatrzymane.
Następnie w instrukcji printf użyliśmy nazwy funkcji i separatora kropek, aby uzyskać dostęp do składowych danych struktura stat .
Następnie dla trybu pliku uzyskaliśmy dostęp do makr lub flag st_mode. Tutaj logiczny i operator służy do drukowania odpowiednich trybów. Sprawdziliśmy uprawnienia dla użytkownika, grupy i innych dla określonego pliku (nazwa pliku wprowadzona przez użytkownika).
Dzięki temu możesz zobaczyć, jak używać wywołania systemowego stat z języka programowania C, aby uzyskać informacje z jądra systemu operacyjnego o plikach. Jeśli masz pytanie, daj nam znać w sekcji komentarzy.