如何操作实现字符设备

发布于 2022-09-20 13:45:45 字数 2088 浏览 17 评论 0

#define __NO_VERSION__

#include <linux/module.h>
#include <linux/config.h>
#include <linux/version.h>

#include <asm/uaccess.h>

#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>

unsigned int test_major = 0;

static ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *f_pos)

{ int left;

if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;

for(left = count ; left > 0 ; left--)
{
__put_user(1,buf);
buf++;
}

return count;
}

static ssize_t write_test(struct file *file, const char *buf, size_t count, loff_t *f_pos)
{
return count;
}

static int open_test(struct inode *inode,struct file *file )

{
MOD_INC_USE_COUNT;
return 0;
}

static int release_test(struct inode *inode,struct file *file )
{
MOD_DEC_USE_COUNT;
return 0;
}

struct file_operations test_fops = {
read:read_test,
write:write_test,
open: open_test,
release:release_test
};

int init_module(void)
{
int result;
result = register_chrdev(0, "test", &test_fops);
if (result < 0) {
printk(KERN_INFO "test: can't get major number\n");
return result;

}

if (test_major == 0) test_major = result; /* dynamic */

return 0;

}

void cleanup_module(void)

{

unregister_chrdev(test_major, "test");

}
还是老问题,呵呵,这样一个字符设备的驱动程序,已经加载到内核模块中,通过什么操作"用户可以像处理普通文件一样,对硬件设备进行打开(open)、关闭(close)、读写(read/write)等操作"(书上写的一句话)???麻烦高手解答下,其他的问题就解决了,我的意思是不进入程序内部,来对此设备进行操作,该如何实现,谢谢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

滥情哥ㄟ 2022-09-27 13:45:45

你也挺粗心的啊,好像应该是printf("%d\n", buf[ i ])吧,用%d主要是楼主实际上是想传一个整数值,1用%c打印不好看出来。

[ 本帖最后由 Cyberman.Wu 于 2008-8-11 12:50 编辑 ]

二智少女 2022-09-27 13:45:45

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main()

{

int testdev;

int i;

char buf[10];

testdev = open("/dev/test",O_RDWR);

if ( testdev == -1 )

{

printf("Cann't open file \n");

exit(0);

}

read(testdev,buf,10);

for (i = 0; i < 10;i++)

printf("%d\n",buf);

close(testdev);

}
测试程序,无奈了,输出的不是1
全是-1073746064

久光 2022-09-27 13:45:45

在请教个问题,测试write这个参数的程序改怎么写?谢谢!

感性 2022-09-27 13:45:45

1. 你打印语句错了,一直在打印buf的地址。
2. 你的读操作没有校验一下返回值。

对于写测试的话确实麻烦一些,但你的测试数据很少不妨用printk打印一下然后用dmesg查看。

温柔少女心 2022-09-27 13:45:45

楼主挺粗心的,
memset(buf,0,sizeof(buf));

printf("%c\n",buf);

身边 2022-09-27 13:45:45

测试程序的问题:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main()

{

int testdev;

int i;

char buf[10];

testdev = open("/dev/test",O_RDWR);

if ( testdev == -1 )

{

printf("Cann't open file \n");

exit(0);

}

memset(buf, 0, 10);
read(testdev,buf,10);

for (i = 0; i < 10;i++) {

printf("%c\n",*buf);
buf++;
}

close(testdev);

}

[ 本帖最后由 dreamice 于 2008-8-11 13:12 编辑 ]

背叛残局 2022-09-27 13:45:45

原帖由 yyykkk1229 于 2008-8-9 11:32 发表
在请教个问题,测试write这个参数的程序改怎么写?谢谢!

和read函数差不多,只是你这个可能看不到什么内核的效果。

先open
然后write操作
最后close
就行了

还不是爱你 2022-09-27 13:45:45

非常感谢大家的回答!!!问题解决了

寻找一个思念的角度 2022-09-27 13:45:45

选的答案似乎也出错了,没仔细看,dreamice的答案也很好
%c,buf
%s,buf
buf定义的是字符,%d显示不出的吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文