免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3185 | 回复: 9
打印 上一主题 下一主题

如何操作实现字符设备 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-09 10:11 |只看该作者 |倒序浏览
5可用积分
#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)等操作"(书上写的一句话)???麻烦高手解答下,其他的问题就解决了,我的意思是不进入程序内部,来对此设备进行操作,该如何实现,谢谢~

最佳答案

查看完整内容

你也挺粗心的啊,好像应该是printf("%d\n", buf[ i ])吧,用%d主要是楼主实际上是想传一个整数值,1用%c打印不好看出来。[ 本帖最后由 Cyberman.Wu 于 2008-8-11 12:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-09 10:11 |只看该作者

回复 #6 dreamice 的帖子

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

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

论坛徽章:
0
3 [报告]
发表于 2008-08-09 10:37 |只看该作者
#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

论坛徽章:
0
4 [报告]
发表于 2008-08-09 11:32 |只看该作者
在请教个问题,测试write这个参数的程序改怎么写?谢谢!

论坛徽章:
0
5 [报告]
发表于 2008-08-09 16:14 |只看该作者
1. 你打印语句错了,一直在打印buf的地址。
2. 你的读操作没有校验一下返回值。

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

论坛徽章:
0
6 [报告]
发表于 2008-08-10 14:37 |只看该作者
楼主挺粗心的,
memset(buf,0,sizeof(buf));

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

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2008-08-11 10:05 |只看该作者

回复 #2 yyykkk1229 的帖子

测试程序的问题:

#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 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-08-11 10:11 |只看该作者
原帖由 yyykkk1229 于 2008-8-9 11:32 发表
在请教个问题,测试write这个参数的程序改怎么写?谢谢!


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

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

论坛徽章:
0
9 [报告]
发表于 2008-08-11 15:12 |只看该作者
非常感谢大家的回答!!!问题解决了

论坛徽章:
0
10 [报告]
发表于 2008-08-11 15:15 |只看该作者
选的答案似乎也出错了,没仔细看,dreamice的答案也很好
%c,buf
%s,buf
buf定义的是字符,%d显示不出的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP