内核版本:Linux-4.14

随便写了个 proc 下节点的测试程序,可以用来与应用层交互。

也可以单独的用来做调试打印使用,例如封装个 my_printk 将信息单独存在节点内,然后可以在应用层 cat 出来查看。

 #include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <asm/irq.h>
#include <asm/io.h> #define MSG_BUF_LEN 1024 static unsigned char msg_buf[MSG_BUF_LEN] = {};
static unsigned int msg_len = ;
static DECLARE_WAIT_QUEUE_HEAD(proc_msg_waitq); static ssize_t proc_msg_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos)
{
unsigned int ret = ; /* 如果 msg_len 为 0,则等待数据 */
wait_event_interruptible(proc_msg_waitq, msg_len);
copy_to_user(user_buf, msg_buf, msg_len);
ret = msg_len;
msg_len = ; return ret;
} static ssize_t proc_msg_write(struct file *file, const char __user *user_buf,
size_t count, loff_t *ppos)
{
if(copy_from_user(msg_buf, user_buf, count)) {
return -EFAULT;
}
msg_len = count;
wake_up_interruptible(&proc_msg_waitq); return count;
} const struct file_operations proc_msg_operations = {
.read = proc_msg_read,
.write = proc_msg_write,
}; static int proc_msg_init(void)
{
/* 在 proc 下创建了 proc_msg */
proc_create("proc_msg", S_IRUSR, NULL, &proc_msg_operations); return ;
} static void proc_msg_exit(void)
{
remove_proc_entry("proc_msg", NULL);
} module_init(proc_msg_init);
module_exit(proc_msg_exit);
MODULE_LICENSE("GPL");

编译脚本如下:

KERN_DIR = /home/lance/nanopi/linux-4.14/

all:
make -C $(KERN_DIR) M=`pwd` modules
rm -rf *.o *.bak *.order *.mod.c *.symvers clean:
make -C $(KERN_DIR) M=`pwd` modules clean obj-m += proc_msg.o

安装模块测试:

/ # insmod proc_msg.ko
/ # echo hello > /proc/proc_msg
/ # cat /proc/proc_msg
hello

成功输出节点内信息。

proc 下创建与应用交互的可读写节点的更多相关文章

  1. centos环境下创建数据库和表的方法

    centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database         ...

  2. Android下创建一个输入法

    输入法是一种可以让用户输入文字的控件.Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音.当安装了特定输入法之后,用户即可在系统 ...

  3. 设备驱动基础学习--/proc下增加节点

    在需要创建一个由一系列数据顺序组合而成的/proc虚拟文件或一个较大的/proc虚拟文件时,推荐使用seq_file接口. 数据结构struct seq_fille定义在include/linux/s ...

  4. 微软Azure 经典模式下创建内部负载均衡(ILB)

    微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...

  5. 无法在“EntityFramework”已存在的情况下创建影像复制该文件的解决方案

    问题产生的原因:你项目正在生成中你就打开浏览器预览了,导致这个问题解决方案:右击重新生成项目,等生成后再打开 “/”应用程序中的服务器错误. 无法在“EntityFramework”已存在的情况下创建 ...

  6. Linux:Ubuntu16.04下创建Wifi热点

    Linux:Ubuntu16.04下创建Wifi热点 说明: 1.Ubuntu16.04里面可以直接创建热点,而不用像以前的版本,还要其他辅助工具. 2.本篇文章转载自编程人生 具体步骤如下: 1.  ...

  7. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  8. 解决Oracle在scott用户下创建视图(VIEW)权限不足的方法

    问题描述:在scott用户下创建视图的时候,报错:权限不足.(其他用户以此类推)解决方法: 以dba用户登录 sqlplus / as sysdba 赋予scott用户创建VIEW的权限 grant  ...

  9. windows环境下创建 .文件夹

    一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...

随机推荐

  1. 通过jar包名称,获取maven的依赖信息GAV

    烦恼:当我们手上有一堆三方件jar包,想要转成maven管理时,需要一个一个配置进pom文件中,而且GAV信息还得去收集. 为了快速生成如下信息,我们可以这样.... GAV:groupId + ar ...

  2. 通信、端点、IO、文件

    什么是网络套接字(Socket)?一时还真不好回答,而且网络上也有各种解释,莫衷一是.下文将以本人所查阅到的资料来说明一下什么是Socket. Socket定义 Socket在维基百科的定义: A n ...

  3. CF1102D-Balanced Ternary String-(贪心)

    http://codeforces.com/problemset/problem/1102/D 题意: 有n个字符,只能为012,现要通过变换让012的数量相等,并且使字典序最小. 解题: 由样例可以 ...

  4. kafka中的offset概念

    在 Kafka 中无论是 producer 往 topic 中写数据, 还是 consumer 从 topic 中读数据, 都避免不了和 offset 打交道, 关于 offset 主要有以下几个概念 ...

  5. 洛谷P1107 [BJWC2008]雷涛的小猫 题解

    题面 以下是luogu给的标签 但字符串是什么鬼.... 玄学... 哦吼~ #include<cstdio> #include<iostream> using namespa ...

  6. div模拟textarea且高度自适应

    需求 我们知道文本超出 textarea 高度后,textarea 就会出现滚动条,需求就是让 textarea 高度跟随文本高度变化,屏蔽滚动条,原来做过用js去监听文本行数,然后改变文本框的高度, ...

  7. share memory between guest and nic

    通过硬件的IOMMU,内核提供的共享内存.VFIO可以实现. REF: 1. offical DPDK API Doc, 简书有翻译版 DPDK编程指南(翻译)(一)  (二十七) 2. dpdk v ...

  8. 洛谷/SPOJ SP3267 题解

    若想要深入学习主席树,传送门. Description: 给定数列 \(\{a_n\}\) ,求闭区间 \([l,r]\) 的互异的个数. Method: 扫描序列建立可持续化线段树,若此元素是第一次 ...

  9. 禁止tomcat的Catina.out的累计输出

    禁止tomcat的Catina.out的累计输出 1.设置 catina.sh的CATALINA_OUT=/dev/null

  10. Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题

    一.问题如下: cv2.findContours()这个方法是用来找出轮廓值的: # cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓 binary, c ...