Linux关于proc_create函数的修改

简介: Linux关于proc_create函数的修改

错误提示:"passing argument 4 of ‘proc_create’ from incompatiable pointer type"如下图

可以看到提示参数不匹配,通过打开proc_fs.h文件可以看到有这个函数的定义,见下图。

可以看到,第四个参数定义为const struct proc_ops *proc_ops,而非参考代码中的const struct file_operations *proc_fops。因而需要对proc_ops结构体进行修改,通过查阅proc_ops结构体的定义,见下图

可以看到只需对其中的成员proc_read赋值为read_proc即可。

参考代码如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include<linux/sched.h>
#include <asm/uaccess.h>
#include <linux/proc_fs.h>
static struct proc_dir_entry *proc_parent;
int len,temp;
char *msg;
static ssize_t read_proc(struct file *filp,char __user *buf,size_t count,loff_t *offp ) 
{
  int a;  //used to recept the value return from the function 
       if(count>temp)
              count=temp;
        temp=temp-count; 
        a=raw_copy_to_user(buf,msg, count);
        if(count==0)
              temp=len; 
        return count;
}
static struct proc_ops proc_fops={
    .proc_read = read_proc
};
void create_new_proc_entry(void)
{
      /*create a new directory named hello, and return a pointer point to this dir*/
      proc_parent = proc_mkdir("hello",NULL);
      if(!proc_parent)
      {
            printk(KERN_INFO "Error creating proc entry");
       }
      /*create a file named world, add read attribute to this file using proc_fops*/
      proc_create("world",0,proc_parent,&proc_fops);
      msg="hello world\n"; /*file content*/
      len=strlen(msg);
      temp=len;
      printk(KERN_INFO "1.len=%d",len);
      printk(KERN_INFO "proc initialized");
}
static int __init proc_init(void)
{
      create_new_proc_entry();
      return 0;
}
static void __exit proc_cleanup(void)
{
       printk(KERN_INFO " Inside cleanup_module\n");
       remove_proc_entry("hello",proc_parent);
       remove_proc_entry("world",NULL);
}
MODULE_LICENSE("GPL");
module_init(proc_init);
module_exit(proc_cleanup);


相关文章
|
存储 Linux
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
490 26
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
1094 19
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
1045 18
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
770 13
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1084 6
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
620 3
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
Linux PHP
Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程
【8月更文挑战第27天】本文介绍两种禁用PHP执行的方法:使用`PHP_diseval_extension`禁用和通过`suhosin`禁用。由于`suhosin`不支持PHP8,仅适用于PHP7及以下版本,若服务器安装了PHP5.6,则需对应安装`suhosin-0.9.38`版本。文章提供了详细的安装步骤,并强调了宝塔环境下与普通环境下的PHP路径差异。安装完成后,在`php.ini`中添加`suhosin.so`扩展并设置`executor.disable_eval = on`以禁用执行功能。最后通过测试代码验证是否成功禁用,并重启`php-fpm`服务生效。
558 2
|
Shell Linux C语言
Linux0.11 execve函数(六)
Linux0.11 execve函数(六)
859 1
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数