Как определить, является ли открытый файл сокетом или каналом? - PullRequest
8 голосов
/ 30 марта 2012

Я пытаюсь выяснить, какие элементы из struct fdtable или struct file позволят мне определить, является ли открытый файл сокетом или каналом.

Единственный путь, который я могу найти, это:

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

Возвращает имя устройства в точке монтирования, все сокеты / каналы, очевидно, принадлежат sockfs или pipefs соответственно.

Есть ли более быстрый способ проверить, является ли открытый файл сокетом или каналом, используя другой элемент struct file или fdtable?

Примечание: я использую определения ядра из 2.6.24

1 Ответ

11 голосов
/ 30 марта 2012

В linux / stat.h есть специальные определения макросов, которые проверяют 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)

Кажется, вам нужно использовать 2 из них - S_ISFIFO и S_ISSOCK таким образом:

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