Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316219
  • 博文数量: 72
  • 博客积分: 3111
  • 博客等级: 中校
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 15:45
个人简介

朝着心的方向前进

文章分类

全部博文(72)

文章存档

2014年(5)

2013年(1)

2012年(1)

2011年(1)

2010年(24)

2009年(40)

我的朋友

分类: LINUX

2009-11-15 14:18:20

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
阅读(1033) | 评论(0) | 转发(0) |
0

上一篇:Linux内核模块了解

下一篇:OpenGL扫盲

给主人留下些什么吧!~~