2014-10-31 92 views
2

我正在使用內核3.13.0編寫Linux設備驅動程序,我很困惑,爲什麼我得到這個警告。爲什麼會出現不兼容的指針類型警告?

warning: initialization from incompatible pointer type [enabled by default] 
    .read = read_proc, 
    ^
warning: (near initialization for ‘proc_fops.read’) [enabled by default] 

據我可以告訴我的proc函數的file_operations設置是相同的設備功能。我可以讀寫/ dev/MyDevice,沒有任何問題,也沒有任何警告。 proc寫函數不會引發警告,只會引發讀取。我做錯了什麼?

/*****************************************************************************/ 
//DEVICE OPERATIONS 
/*****************************************************************************/ 
static ssize_t dev_read(struct file *pfil, char __user *pBuf, size_t 
    len, loff_t *p_off) 
{ 
    //Not relevant to this question 
} 

static ssize_t dev_write(struct file *pfil, const char __user *pBuf, 
         size_t len, loff_t *p_off) 
{ 
    //Not relevant to this question 
} 

static struct file_operations dev_fops = 
{ //None of these cause a warning but the code is identical the proc code below 
    .owner = THIS_MODULE, 
    .read = dev_read, 
    .write = dev_write 
}; 

/*****************************************************************************/ 
//PROCESS OPERATIONS 
/*****************************************************************************/ 
static int read_proc(struct file *pfil, char __user *pBuf, size_t 
       len, loff_t *p_off) 
{ 
    //Not relevant to this question 
} 

static ssize_t write_proc(struct file *pfil, const char __user *pBuf, 
         size_t len, loff_t *p_off) 
{ 
    //Not relevant to this question 
} 

struct file_operations proc_fops = 
{ 
    .owner = THIS_MODULE, 
    .write = write_proc, 
    .read = read_proc, //This line causes the warning. 
}; 

編輯:所以答案是,我是一個白癡沒有看到「int」與「ssize_t」。謝謝大家! Codenheim和Andrew Medico大致在同一時間得到了正確的答案,但我選擇了Medico's,因爲它對未來的訪問者來說更迂腐和明顯。

回答

3

read_proc函數的返回類型(引發警告)與乾淨編譯的函數不匹配。

static ssize_t dev_read(struct file *pfil, char __user *pBuf, size_t len, loff_t *p_off) 

static int read_proc(struct file *pfil, char __user *pBuf, size_t len, loff_t *p_off) 

ssize_tint可以是不同的尺寸。你的函數的返回類型應該是ssize_t

1

函數指針預計隨着ssize_t返回類型的功能,但你給它的int

一個你需要一個ssize_t那裏,不是int

+0

也不是這樣。不警告的函數返回** s ** size_t。 – 2014-10-31 16:22:12

+0

@AndrewMedico - 這是一個錯字。我首先將它作爲size_t讀取,但重點仍然相同。 – codenheim 2014-10-31 16:24:18

3

雖然有文件操作的工作只是根據這種結構遵循的規則

struct file_operations { 
    struct module *owner; 
    loff_t (*llseek) (struct file *, loff_t, int); 
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); 
    ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); 
    int (*iterate) (struct file *, struct dir_context *); 
    unsigned int (*poll) (struct file *, struct poll_table_struct *); 
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 
    int (*mmap) (struct file *, struct vm_area_struct *); 
    int (*open) (struct inode *, struct file *); 
    int (*flush) (struct file *); 
    int (*release) (struct inode *, struct file *); 
    int (*fsync) (struct file *, loff_t, loff_t, int datasync); 
    int (*aio_fsync) (struct kiocb *, int datasync); 
    int (*fasync) (int, struct file *, int); 
    int (*lock) (struct file *, int, struct file_lock *); 
    ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 
    unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 
    int (*check_flags)(int); 
    int (*flock) (struct file *, int, struct file_lock *); 
    ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int); 
    ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int); 
    int (*setlease)(struct file *, long arg, struct file_lock **); 
    long (*fallocate)(struct file *, int mode, loff_t offset, loff_t len); 
    int (*show_fdinfo)(struct seq_file *m, struct file *f); }; 

你可以在內核文檔文檔/文件系統/ vfs.txt這種結構,也可以使用標籤VIM -t從file_operations中找到它內核源代碼或者你可以看看頭文件/include/linux/fs.h。

只是你的錯誤是你使用靜態int而不是使用ssize_t的返回類型。

相關問題