2012-03-30 39 views
7

Tôi đang cố gắng tìm (các) thành viên của số struct fdtable hoặc struct file sẽ cho phép tôi xác định xem tệp mở có phải là ổ cắm hay ống dẫn hay không.Làm cách nào để xác định xem tệp mở là ổ cắm hay đường ống?

con đường duy nhất tôi có thể tìm thấy dường như là:

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

này trả về tên thiết bị tại mountpoint, tất cả các ổ cắm/Ống rõ ràng thuộc về sockfs hoặc pipefs tương ứng.

Có cách nào nhanh hơn để kiểm tra xem tệp mở có phải là ổ cắm hoặc đường ống sử dụng thành viên khác của tệp struct hoặc fdtable không?

Lưu ý: Tôi đang sử dụng các định nghĩa hạt nhân từ 2.6.24

Trả lời

10

Có nghĩa vĩ mô đặc biệt tại linux/stat.h để kiểm tra 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) 

Có vẻ như rằng bạn sẽ cần phải sử dụng 2 trong số đó - S_ISFIFOS_ISSOCK theo cách như vậy:

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

Cảm ơn điều này rất hữu ích. –

Các vấn đề liên quan