2012-03-30 7 views
7

struct fdtableまたはstruct fileのメンバーが、開いているファイルがソケットであるかパイプであるかを判断できるようにしようとしています。開いているファイルがソケットであるかパイプであるかを調べる方法は?

私が見つけるように見えることができる唯一のパスは次のとおりです。

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

これは、すべてのソケット/パイプが明らかにそれぞれsockfsまたはpipefsに所属し、マウントポイントにデバイス名を返します。

開いているファイルが、structファイルまたはfdtableの別のメンバーを使用するソケットまたはパイプであるかどうかを確認する方法がありますか?

注:私は2.6.24

答えて

10

からカーネル定義を使用していますinode->i_modeをチェックlinux/stat.hで特別なマクロ定義があります。

#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)) {...} 
+0

おかげで、これは非常に役に立ちました。 –

関連する問題