2016-10-20 30 views
7

Natknąłem się na makro S_ISREG() w programie C, który pobiera atrybuty plików. Niestety, nie ma podstawowych informacji na temat tego makra online. Dyskusje na ten temat są bardziej zaawansowane, ale to wykracza poza to, czego szukam.Co to jest S_ISREG() i co robi?

Co to jest S_ISREG() i co robi? W kontekście programu, który pobiera atrybuty plików, do czego służy i co dokładnie robi?

Dziękuję.

+1

[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

+0

@ Clifford Dzięki. Jedyne inne pytania dotyczące tego makra dotyczyły bardziej zaawansowanych aplikacji. –

+0

@ryyker Nie, nie jest. Jeśli przeczytasz opublikowane przez siebie pytanie, przekonasz się, że koncentruje się na bardziej zaawansowanych aplikacjach. –

Odpowiedz

12

S_ISREG() to makro używane do interpretacji wartości w stat-struct, zwróconych ze statycznego wezwania systemu(). Wartość true sprawdza, czy argument (element st_mode w struct stat) jest zwykłym plikiem.

Zobacz man stat lub man fstat w celu uzyskania dalszych szczegółów. Poniżej znajduje się odpowiednia część strony człowieka:

Because tests of the above form are common, additional macros are defined by POSIX to allow the test of the file type in st_mode to be written more concisely: 

     S_ISREG(m) is it a regular file? 

     S_ISDIR(m) directory? 

     S_ISCHR(m) character device? 

     S_ISBLK(m) block device? 

     S_ISFIFO(m) FIFO (named pipe)? 

     S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.) 

     S_ISSOCK(m) socket? (Not in POSIX.1-1996.) 

    The preceding code snippet could thus be rewritten as: 

     stat(pathname, &sb); 
     if (S_ISREG(sb.st_mode)) { 
      /* Handle regular file */ 
     } 
3

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.

+0

Twój test if jest odwrócony. Jeśli S_ISREG() ma wartość niezerową, to dany obiekt jest zwykłym plikiem. –

+0

@BjornA. : Naprawiono - dzięki za miejsce. – Clifford

4

Standard POSIX, który definiuje S_ISREG, jest w rzeczywistości online.

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html

Cytat:

następujące makra powinny być dostarczone do sprawdzenia, czy plik jest określonego typu. Wartość dostarczona do makr to m o wartości st_mode ze struktury stat. Makro musi mieć wartość niezerową, jeśli test jest prawdziwy; 0, jeśli test jest fałszywy.

[...]

S_ISFIFO (m)

      testowy do rury lub FIFO szczególnego pliku.

S_ISREG (m)

      testowy do zwykłego pliku.

S_ISLNK (m)

      testowy do dowiązania.

[...]

Typowym sposobem korzystania S_ISREG jest najpierw wywołać funkcję stat wypełnić struct stat obiektu z informacjami o pliku. Następnie wartość elementu st_mode tej struktury, typu integer, można przetestować za pomocą tego makra.

Oprócz standardu istnieją strony man z różnych systemów online, a także tutoriale o programowaniu za pomocą statystyk. Wikipedia ma page on stat, z pozornie kompletnym przykładem kodu. Chociaż nie jest to funkcja S_ISREG, można ją łatwo przerobić.