2012-03-30 9 views
7

Estoy tratando de encontrar qué miembro (s) de struct fdtable o struct file me permitirá determinar si un archivo abierto es o no un socket o un conducto.¿Cómo determinar si un archivo abierto es un socket o un conducto?

el único camino que puedo encontrar es:

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

Esto devuelve el nombre del dispositivo en el punto de montaje, todos los zócalos/tubos al parecer pertenecen a sockfs o pipefs respectivamente.

¿Hay alguna manera más rápida de verificar si un archivo abierto es un socket o un conducto usando un miembro diferente del archivo struct o fdtable?

Nota: Estoy utilizando las definiciones del kernel 2.6.24 de

Respuesta

10

Hay definiciones de macros especiales en linux/stat.h que comprueba 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) 

parece que tendrá que utilizar 2 de ellos - S_ISFIFO y S_ISSOCK de manera tal:

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

Gracias esto era muy útil. –

Cuestiones relacionadas