Testuje element struktury stat
pobierane za pomocą funkcji stat()
st_mode
aby ustalić, czy jest to plik regualar (tj na dysku lub pamięci masowej zamiast powiedzieć ., katalog, gniazdo, na przykład łączem symbolicznym
struct stat sb;
if(stat(file_path, &sb) 1= -1)
{
if(S_ISREG(sb.st_mode) != 0)
{
printf("%s is a file", file_path) ;
}
else
{
printf("%s is not a file", file_path) ;
}
}
człon st_mode
zawiera 4 bity maskowane S_IFMT
(0170000) wartości tych bitów są:
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
więc makro S_ISREG mighte być zdefiniowana w następujący sposób:
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
Ponieważ jest to makro można spojrzeć na jego rzeczywistej definicji w pliku nagłówkowym sys/stat.h
. W nagłówku GNU jest zdefiniowane:
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
...
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
co jest zasadniczo takie samo w mojej uproszczonej wersji.
[Dokumentacja] (https://www.gnu.org/software/libc/manual/html_node/Testing-File-Type.html) mówi "* To makro zwraca wartość niezerową, jeśli plik jest zwykłym plikiem. *" - o ile więcej "podstawowych" można uzyskać; Naprawdę zastanawiam się, co jest takiego "zaawansowaną dyskusją", co naprawdę można na to poradzić? – Clifford
@ Clifford Dzięki. Jedyne inne pytania dotyczące tego makra dotyczyły bardziej zaawansowanych aplikacji. –
@ryyker Nie, nie jest. Jeśli przeczytasz opublikowane przez siebie pytanie, przekonasz się, że koncentruje się na bardziej zaawansowanych aplikacjach. –