如何确定一个打开的文件是套接字还是管道?

10

我想确定struct fdtablestruct file的哪个成员可以让我确定一个打开的文件是套接字还是管道。

我能找到的唯一途径是:

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

这会返回挂载点处的设备名称,所有socket/pipe显然分别属于sockfs或pipefs。

有没有一种更快的方法,使用struct file或fdtable的其他成员来检查打开的文件是否为socket或pipe?

注意:我正在使用2.6.24内核定义。

1个回答

12

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)

看起来你需要同时使用S_ISFIFOS_ISSOCK,具体操作如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接