3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424

用户app与驱动交互最常见的做法是insmod驱动后,生成一个设备节点,app通过open,read等系统调用去操作这个设备节点,这里先用mknode命令调试。

mknod 设备名 设备类型(b块设备/c字符设备/p管道) 主设备号 次设备号

mknod /dev/hello c 240 0

使用mknode后生成了/dev/hello节点,写入数据到hello节点中,查看dmesg的输出发现调用了驱动的open write release

echo 1 > /dev/hello

802.771723\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_open 48 \[ 802.773196\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_write 40 \[ 802.773285\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_release 56

复制代码
#include "linux/string.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

/*
读数据 ./hello_test xxx(设备节点名字)
写数据 ./hello_test xxx(设备节点名字) string
*/

int main(int argc, char **argv)
{
    int fd;
    int len;
    char buf[1024];

    if(argc < 2)
    {
        printf("Usage :\n");
        printf("%s <dev> [str]\n", argv[0]);
        return -1;
    }

    //open
    fd = open(argv[1], O_RDWR);
    if(fd < 0)
    {
        printf("open %s failed\n", argv[1]);
        return -1;
    }

    //read
    if(argc == 2)
    {
        len = read(fd, buf, sizeof(buf));
        printf("%s\n", buf);
    }
    //write
    else if(argc == 3)
    {
        len = write(fd, argv[2], strlen(argv[2]));
    }
    else
    {
        printf("Too many parameters\n");
    }

    close(fd);
}

分别调用 ./hello_test /dev/hello 123 和 ./hello_test /dev/hello 后,查看dmesg输出显示

2770.434595\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_open 48 \[ 2770.434664\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_write 40 \[ 2770.434705\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_release 56 \[ 2772.388372\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_open 48 \[ 2772.388439\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_read 32 \[ 2772.389257\] /home/book/nfs_rootfs/drivers_projects/01_hello_drv/hello_drv.c hello_release 56

app的open write read release都一一对应上了。

这里的./hello_test /dev/hello其实没有读到数据,打印如下,原因下一章再说。

root@100ask:/mnt/drivers_projects/01_hello_drv\]# ./hello_test /dev/hello read size = 1024 data =

相关推荐
知识分享小能手29 分钟前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 进程管理 —语法详解与实战案例(8)
linux·学习·centos
零日失眠者30 分钟前
⚠️ 警告!99%的开发者都踩过这个坑:Python3安装后系统彻底瘫痪!yum直接报废的真相
linux·python
Bigan(安)32 分钟前
【奶茶Beta专项】【LVGL9.4源码分析】04-OS抽象层
linux·c语言·mcu·arm·unix
Bigan(安)33 分钟前
【奶茶Beta专项】【LVGL9.4源码分析】06-tick时间管理
linux·c语言·mcu·arm·unix
2301_7930698234 分钟前
Linux Ubuntu/Windows 双系统 分区挂载指南
linux·windows·ubuntu
道路与代码之旅40 分钟前
Windows 10 中以 WSL 驱 Ubuntu 记
linux·windows·ubuntu
DeeplyMind1 小时前
第5章:并发与竞态条件-13:Fine- Versus Coarse-Grained Locking
linux·驱动开发·ldd
赖small强1 小时前
【Linux C/C++开发】C++多态特性深度解析:从原理到实践
linux·c语言·c++·多态·虚函数表
huangyuchi.1 小时前
【Linux 网络】基于TCP的Socket编程:通过协议定制,实现网络计算器
linux·网络·tcp/ip·linux网络·协议定制·josncpp库·序列与反序列化
刘家炫1 小时前
Linux 基于 Epoll 的主从 Reactor 多线程模型
linux·服务器·reactor·项目·多路转接