linux字符驱动设备中的open函数的调用问题

WizardZz 2012-05-08 10:55:34
这个是应用层默认的open函数定义:int open( const char * pathname,int flags);

这个是驱动程序中一般的open函数的定义:int(*open)(struct inode *inode, struct file *filp)

如下是一个LED点亮的应用层主函数
void main(void)
{
int testdev;
int i;
char buf[10];
testdev = open ("/dev/test",O_RDWR); //这里应该是用的应用层默认的Open函数吧。。。
if(testdev == -1)
{
printf("Cann't open file...../n");
exit(0);
}
printf("buf = 0x%x/n",buf);
read(testdev,buf,10); //成功open以后testdev的值不是为0吗?这里怎么又能够成为file文件描述符呢?
write(testdev,buf,1);
led_ctl.port='G';
led_ctl.bit=5;
led_ctl.value=0;
ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl);
printf("%s",buf);
pause();
close(testdev);
}


我的疑问是:
1.驱动程序中的open函数:int(*open)(struct inode *inode, struct file *filp)
在哪里使用了啊?
2.驱动中的open函数一般是用来做什么的啊?
3.上文代码中,成功open以后testdev的值不是为0吗?这里怎么又能够成为file文件描述符呢?

...全文
1599 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
7楼说的应该对LZ问题很有帮助。
我避开细节说下:

1,2问题:
驱动里的open函数是为应用层的open工作的。
LZ迷茫于二者如何对应起来。
你应用层的open时候,不是open了一个具体文件么? /dev/test。 这个就是你驱动生成的设备节点啊!
open /dev/test,就表示要调用你这个驱动里的open函数。 你open /dev下的其他文件,就调用的其他
驱动的open了。 通过设备节点对应的。

至于应用层open后的返回值。 LZ不能自己 打印看下么????
  • 打赏
  • 举报
回复
首先你要明白struct inode *,和struct file*的意思,i结点只有一个,对于一个文件来说是唯一的,而struct file并不是唯一的,每打开一个文件就创建一个 struct file结点,对应一个文件描述符。文件描述符可能是0,1,2,3。。。
testdev = open ("/dev/test",O_RDWR)这个open会调用到内核中,内核要创建自己的char device节点 ,你这里创建的名字叫test。要对文件读和写,可以通过inode ,file结构体里面的成员把相关初始化设备的指针保存起来,最后用container of宏找到相关结点的指针。
你看看ldd的字符设备的书就知道了阿。。。
jjlmonkey 2012-05-31
  • 打赏
  • 举报
回复
1.驱动程序中的open函数:int(*open)(struct inode *inode, struct file *filp)
在哪里使用了啊?
驱动中的open函数确实是在应用层的open调用后调用的。
2.驱动中的open函数一般是用来做什么的啊?
一般驱动中的open函数并不需要做什么,一般赋值为空或者直接return 0都可以,除非例如misc这类通用字符驱动用来分别调用不同的注册为misc设备的文件操作函数。
3.上文代码中,成功open以后testdev的值不是为0吗?这里怎么又能够成为file文件描述符呢?
上文中的open 成功并不是0;因为在kernel层的open系统调用函数在一开始会分配一个未使用的fd,如果后续操作成功就返回fd,失败就返回错误码。
elalll 2012-05-14
  • 打赏
  • 举报
回复
拿打印函数打印一下就行了吧
xuyinglin 2012-05-10
  • 打赏
  • 举报
回复
放回的文件描述符是struct file,这是在打开设备文件的时候内核创建的,用于记录一些关于这个设备的信息。每打开一个设备文件都会创建一个。之于不能打开时返回-1,我也很奇怪,一般返回的值类型应该一样啊,真好玩
fish_linux 2012-05-08
  • 打赏
  • 举报
回复
这个问题我可以回答你!我是搞驱动的!
1.驱动程序中的open函数即你说的int(*open)(struct inode *inode, struct file *filp)
在执行 testdev = open ("/dev/test",O_RDWR)语句时被调用,并且open ("/dev/test",O_RDWR)的返回值就是文件描述符;
2.驱动中的open函数一般用于设备专有数据的初始化,申请相关资源及进行设备的初始化等工作,对于简单的设备而言,open函数可以不做具体的工作,你在应用层通过系统调用open打开设备时,如果打开正常,就会得到该设备的文件描述符,之后,你可以通过该描述符对设备进行read和write等操作;
3.在你的程序里testdev就是文件描述符,一般定义为 int fd;
应该明白了吧!
fish_linux 2012-05-08
  • 打赏
  • 举报
回复
应用层的open函数是一个系统调用,它最终会调用驱动层中的open函数,应用层的open打开成功返回一个文件描述符而不是零,这点你可能弄错了,你查查吧!
以下是我在网上搜的:

open 函数用于打开和创建文件。以下是 open 函数的简单描述:

#include <fcntl.h>

int open(const char *pathname, int oflag, ... /* mode_t mode */);

返回值:成功则返回文件描述符,否则返回 -1

WizardZz 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
这个问题我可以回答你!我是搞驱动的!
1.驱动程序中的open函数即你说的int(*open)(struct inode *inode, struct file *filp)
在执行 testdev = open ("/dev/test",O_RDWR)语句时被调用,并且open ("/dev/test",O_RDWR)的返回值就是文件描述符;
2.驱动中的open函数一般用于设备专有数据的……
[/Quote]


嗯 我的意思是:应用层里的open函数 打开成功不是返回值为0吗? 那 0 怎么去唯一的表示一个文件呢?是不是应用层的open函数打开成功了以后,接着就继续调用执行驱动程序里我们自己写的open函数,然后这个时候的open函数中的第一个参数testdev 的值就不是0了 而是文件描述符,是这个意思么?

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧