免费注册 查看新帖 |

Chinaunix

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

Linux文件和设备文件初步 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-15 14:18 |只看该作者 |倒序浏览
Linux下的文件操作
系统调用,对文件操作,相当于Win下面的API
涉及文件的创建、打开、读写和关闭文件
常用 函数
创建:
int creat(const char *filename, mode_t mode)
mode是读写权限
mode&umask
int umask(newmask);//修改函数
打开:
int open(const char *pathname, int flags);
int open(const char *pathname,int flags, mode_t mode);
flags为读写权限和访问权限
读写:
int read(int fd, const void *buf, size_t length);
int write(int fd, cosnt void *buf, size_t length);
定位:
int lseek(int fd, offset_t offset, int whence);
常用
lseek(fd, 0, SEEK_END);//返回文件的长度
C函数的文件操作
C函数库的操作实际是独立于具体的平台,不论是DOS,WIN,Vxwoks,Linux都是这些函数
创建和打开:
FILE *fopen(const char *path, const char *mode);
实际是创建文件后以后面的mode指定打开的模式
读写:
C函数库支持以字符、字符串为单位,支持按照某种格式进行文字的读写,
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s,   FILE *stream);
int printf(FILE *stream, const char *format,...);
int fscanf(FILE *stream, const char *foramt,...);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
C库函数的读写中的定位函数
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
int fseek(FILE *stream, long offset, int whence);
关闭
int fclose(FILE *stream);
文件系统
应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备接口之间的接口
file_operatinons结构体成员函数,它包含了对文件的打开关、关闭、读写、控制等一系列
成员函数
字符设备上面没有磁盘文件系统,主要操作函数就由file_operations提供了,file_operations
正是字符设备的核心
而比如块设备文件的操作由VFS来提供,
而在设备驱动中,需要关注以下两个结构体(待完善)
file结构体
代表一个打开的文件,由内核在打开文件的时候创建,并传递给在文件上进行操作的任何函数
inode结构体
包含文件访问的权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息,是Linux
文件系统的最基本单位,也是文件系统连接任何子文件目录、文件的桥梁
说明:
对于表示设备文件的inode结构体,i_rdev字段包含设备编号,2.6内核中,主设备号是dev_t
的高12位,次设备号为dev_t的低20位
devfs和udev设备文件系统
devfs是2.4内核的
优点:
1,在设备初始化的时候在/dev进行创建,卸载时候删除
2,驱动程序可以指定设备名,所有者,权限位,用户空间可以修改所有者的权限位
3,不用指定主设备号和次设备号,而是由register_chrdev()传递0设备号来动态的分配主设备号
    并在devfs_register()中指定次设备号
  创建设备目录函数
  devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void *info);
  创建设备文件函数
  devfs_handle_t devfs_register(devfs_handle_t dir, const char *name, unsigned
   int flags, unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info);
  撤消设备文件函数
    void devfs_unregister(devfs_handle_t de);
2.4的设备编程中,分别在模块加载和卸载函数中创建和撤消设备文件是很常见的
udev是2.6内核的(有待于进一步的理解)
知识点:
    1,udev完全在用户态工作,(包括设备命名策略,权限控制和事件处理)利用设备的加入或移除时内核所发送的热挺拔事件来工作
    2,设备的详细信息会由内核输出到位于/sys下的sysfs文件系统
    3,udev根据系统中的硬件的设备的状态动态更新设备文件的状态,/dev目录下只包含系统真正存在的设备
    4,udev是在发现设备时加载驱动,而devfs是在设备访问时个加载驱动
   
另外,理解以下内容:(2.6内核驱动核心架构)
1,sysfs文件系统
2,kobject内核对象
3,kset内核对象集合
4,subsystem内核对象子系统
5,Linux设备模型组件:device结构体
6,属性
7,udev的组成
8,udev规则文件
9,创建和配置udev

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/102267/showart_2094905.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP