2012-03-30 10 views
7

Sto cercando di scoprire quale membro (i) di struct fdtable o struct file mi consentirà di determinare se un file aperto è un socket o una pipe.Come determinare se un file aperto è un socket o una pipe?

l'unica strada che riesco a trovare è:

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

Ciò restituisce il nome del dispositivo al punto di mount, tutti i socket/conduttori apparentemente appartengono a sockfs o pipefs rispettivamente.

Esiste un modo più rapido per verificare se un file aperto è un socket o una pipe che utilizza un membro diverso del file struct o fdtable?

Nota: io sto usando le definizioni del kernel 2.6.24 da

risposta

10

Ci sono speciali definizioni di macro in linux/stat.h che controlla 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) 

Sembra che avrete bisogno di utilizzare 2 di loro - S_ISFIFO e S_ISSOCK in modo tale:

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

Grazie questo è stato molto utile. –