“错误”;隐式声明“;使用proc_从proc_fs.h创建项目

“错误”;隐式声明“;使用proc_从proc_fs.h创建项目,c,linux,C,Linux,我正在使用Fedora19,内核为3.11.6-200.fc19.x86_64 我在学习proc_fs.h时犯了一些错误 看起来这些代码可以在Ubuntu12.04上正常编译,我只是不知道Fedora上有什么问题 [root@frederick-pc Test]# make make -C /lib/modules/3.11.6-200.fc19.x86_64/build M=/home/frederick/Documents/HW_2nd/Test modules make[1]: Enter

我正在使用Fedora19,内核为3.11.6-200.fc19.x86_64

我在学习proc_fs.h时犯了一些错误 看起来这些代码可以在Ubuntu12.04上正常编译,我只是不知道Fedora上有什么问题

[root@frederick-pc Test]# make
make -C /lib/modules/3.11.6-200.fc19.x86_64/build M=/home/frederick/Documents/HW_2nd/Test modules
make[1]: Entering directory `/usr/src/kernels/3.11.6-200.fc19.x86_64'
  CC [M]  /home/frederick/Documents/HW_2nd/Test/rw_proc.o
/home/frederick/Documents/HW_2nd/Test/rw_proc.c: In function ‘rw_proc_init’:
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:43:2: error: implicit declaration of function ‘proc_create_entry’ [-Werror=implicit-function-declaration]
  p = proc_create_entry(PROCFS_NAME, 0644, NULL);
  ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:43:4: warning: assignment makes pointer from integer without a cast [enabled by default]
  p = proc_create_entry(PROCFS_NAME, 0644, NULL);
    ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:51:3: error: dereferencing pointer to incomplete type
  p->read_proc = procfile_read;
   ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:52:3: error: dereferencing pointer to incomplete type
  p->write_proc = procfile_write;
   ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:54:3: error: dereferencing pointer to incomplete type
  p->mode = S_IFREG | S_IRUGO;
   ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:55:3: error: dereferencing pointer to incomplete type
  p->uid = 0;
   ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:56:3: error: dereferencing pointer to incomplete type
  p->gid = 0;
   ^
/home/frederick/Documents/HW_2nd/Test/rw_proc.c:57:3: error: dereferencing pointer to incomplete type
  p->size = 37;
   ^
cc1: some warnings being treated as errors
make[2]: *** [/home/frederick/Documents/HW_2nd/Test/rw_proc.o] Error 1
make[1]: *** [_module_/home/frederick/Documents/HW_2nd/Test] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.11.6-200.fc19.x86_64'
make: *** [default] Error 2
这是我的密码

rw_程序c

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/proc_fs.h>
#include<asm/uaccess.h>

#define PROCFS_MAX_SIZE 1024
#define PROCFS_NAME "my_procfile_1k"

MODULE_LICENSE("GPL");

static struct proc_dir_entry *p = NULL;
static char procfs_buffer[PROCFS_MAX_SIZE];
static unsigned long procfs_buffer_size = 0;
static int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof,void *data)
{
    int ret;
    printk(KERN_INFO "procfile_read (/proc/%s) called\n", PROCFS_NAME);
    if (offset > 0) 
    {
        ret = 0;
    } 
    else 
    {
        memcpy(buffer, procfs_buffer, procfs_buffer_size);
        ret = procfs_buffer_size;
    }
    return ret;
}
static int procfile_write(struct file *file, const char *buffer, unsigned long count,void *data)
{
    procfs_buffer_size = count;
    if (procfs_buffer_size > PROCFS_MAX_SIZE ) {
    procfs_buffer_size = PROCFS_MAX_SIZE;
    }
        if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) {
        return EFAULT;
    }
    return procfs_buffer_size;
}

static int rw_proc_init(void)
{
    p = proc_create_entry(PROCFS_NAME, 0644, NULL);
    if (p == NULL) 
    {
        remove_proc_entry(PROCFS_NAME, NULL);
        printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",
        PROCFS_NAME);
        return ENOMEM;
    }
    p->read_proc = procfile_read;
    p->write_proc = procfile_write;
    //p->owner = THIS_MODULE;
    p->mode = S_IFREG | S_IRUGO;
    p->uid = 0;
    p->gid = 0;
    p->size = 37;
    printk(KERN_INFO "/proc/%s created\n", PROCFS_NAME);
    return 0;
}

static void rw_proc_exit(void)
{
    remove_proc_entry(PROCFS_NAME, NULL);
    printk(KERN_INFO "/proc/%s removed\n", PROCFS_NAME);
}

module_init(rw_proc_init);
module_exit(rw_proc_exit);
#包括
#包括
#包括
#包括
#定义PROCFS_MAX_SIZE 1024
#定义PROCFS\u名称“我的procfile\u 1k”
模块许可证(“GPL”);
静态结构proc_dir_条目*p=NULL;
静态字符procfs_缓冲区[procfs_MAX_SIZE];
静态无符号长procfs\u buffer\u size=0;
静态int procfile_读取(字符*缓冲区、字符**缓冲区位置、偏移量、int缓冲区长度、int*eof、void*数据)
{
int ret;
printk(KERN\u INFO“procfile\u read(/proc/%s)调用\n”,PROCFS\u NAME);
如果(偏移量>0)
{
ret=0;
} 
其他的
{
memcpy(缓冲区、procfs\u缓冲区、procfs\u缓冲区大小);
ret=程序缓冲区大小;
}
返回ret;
}
静态int procfile_write(结构文件*文件、常量字符*缓冲区、无符号长计数、void*数据)
{
procfs_buffer_size=计数;
if(procfs\u buffer\u size>procfs\u MAX\u size){
procfs\u buffer\u size=procfs\u MAX\u size;
}
if(从用户(procfs\u缓冲区、缓冲区、procfs\u缓冲区大小)复制){
返回默认值;
}
返回procfs\u缓冲区大小;
}
静态int rw_proc_init(void)
{
p=proc_create_条目(PROCFS_NAME,0644,NULL);
if(p==NULL)
{
删除\u proc\u条目(PROCFS\u名称,空);
printk(内核警报“错误:无法初始化/proc/%s\n”,
PROCFS_NAME);
返回烯醇化酶;
}
p->read\u proc=procfile\u read;
p->write\u proc=procfile\u write;
//p->owner=该模块;
p->mode=S|u IFREG | S|u IRUGO;
p->uid=0;
p->gid=0;
p->size=37;
printk(KERN\u INFO)/proc/%s已创建\n“,PROCFS\u名称);
返回0;
}
静态无效rw_程序退出(无效)
{
删除\u proc\u条目(PROCFS\u名称,空);
printk(内核信息“/proc/%s已删除\n”,PROCFS\u名称);
}
模块_init(rw_proc_init);
模块退出(rw程序退出);

谁能帮我?THX

您的变量
p
未声明,这是编译器试图告诉您的。您只需在函数开头局部声明变量,如下所示:

struct proc_dir_entry *p = proc_create_entry(PROCFS_NAME, 0644, NULL);

(如果
struct proc\u dir\u entry*
确实是函数返回的类型,我没有检查。)

您的变量
p
没有声明,这就是编译器试图告诉您的。您只需在函数开头局部声明变量,如下所示:

struct proc_dir_entry *p = proc_create_entry(PROCFS_NAME, 0644, NULL);

(如果
struct proc\u dir\u entry*
确实是函数返回的类型,我没有检查。)

最后我自己解决了这个问题

从3.10.0版本开始,
proc\u create\u entry()
的功能似乎已被删除并替换为
proc\u create()


因此,如果您使用比3.10.0更新的内核进行编译,只需在代码中替换它们。最后,我自己解决了这个问题

从3.10.0版本开始,
proc\u create\u entry()
的功能似乎已被删除并替换为
proc\u create()


因此,如果您使用比3.10.0更新的内核进行编译,只需在代码中替换它们,那么我如何修复该错误?@Frederick888,声明变量,我认为这是显而易见的。检查
proc\u create\u entry
的返回类型定义,并使用它。通过将该类型放在
p
前面,您可以通过初始化将该行从赋值语句更改为变量声明和结构来自proc_fs.hWhy
static
?为什么
NULL
。只需在编译器抱怨的地方声明一个局部变量。因此我删除了声明和所有的
static
s,并将上面的代码替换为
struct proc\u dir\u entry*p=proc\u create\u entry(PROCFS\u NAME,0644,NULL),但所有的错误仍然存在。那么我如何修复这个bug呢?@Frederick888,声明变量,我认为这是显而易见的。检查
proc\u create\u entry
的返回类型定义,并使用它。通过将该类型放在
p
前面,您可以通过初始化将该行从赋值语句更改为变量声明和结构来自proc_fs.hWhy
static
?为什么
NULL
。只需在编译器抱怨的地方声明一个局部变量。因此我删除了声明和所有的
static
s,并将上面的代码替换为
struct proc\u dir\u entry*p=proc\u create\u entry(PROCFS\u NAME,0644,NULL),但所有错误仍然存在。