2012-03-30 13 views
7

Próbuję znaleźć członków z struct fdtable lub struct file pozwoli mi określić, czy otwarty plik jest lub nie potoku.Jak ustalić, czy otwarty plik jest gniazdem czy potokiem?

jedyna droga mogę wydawać się znaleźć to:

struct file f ....; 
f.path->mnt->mnt_devname 

ta zwraca nazwę urządzenia na montowania, wszystkie gniazda/rury najwyraźniej należą do sockfs lub pipefs odpowiednio.

Czy istnieje szybszy sposób sprawdzenia, czy otwarty plik jest gniazdem lub potokiem przy użyciu innego elementu pliku struct lub pliku fdtable?

Uwaga: używam definicji jądra od 2.6.24

Odpowiedz

10

Istnieją specjalne definicje makr w linux/stat.h który sprawdza inode->i_mode:

#define S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK) 
    #define S_ISREG(m)  (((m) & S_IFMT) == S_IFREG) 
    #define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR) 
    #define S_ISCHR(m)  (((m) & S_IFMT) == S_IFCHR) 
    #define S_ISBLK(m)  (((m) & S_IFMT) == S_IFBLK) 
    #define S_ISFIFO(m)  (((m) & S_IFMT) == S_IFIFO) 
    #define S_ISSOCK(m)  (((m) & S_IFMT) == S_IFSOCK) 

Wydaje się, że trzeba użyć 2 z nich - S_ISFIFO i S_ISSOCK w taki sposób:

if (S_ISFIFO(file->f_path.dentry->d_inode->i_mode)) {...} 
if (S_ISSOCK(file->f_path.dentry->d_inode->i_mode)) {...} 
+0

Dzięki to był bardzo pomocny. –