秉承“一切都是文件”的设计思想。
驱动最终通过操作系统的文件操作系统调用或c库函数被访问,设备驱动的结构最终也是为了迎合提供给应用程序员的API。
一、通过linux API和c库函数在用户空间进行linux文件操作的编程方法
文件操作系统调用
①创建
int creat(const char *filename,mode_t mode); 参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限
int umask(int newmask); 改调用将umask设置为newmask,返回旧的umask,它只影响读、写和执行权限。
②打开
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
③读写
int read(int fd,const void *buf,size_t length); buf为指向缓冲区的指针,length为缓冲区的大小(以字节为单位)。函数实现从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节。
int write(int fd,const void *buf,size_t length); 函数实现从buf所指向的缓冲区写入length个字节到文件描述符fd所指向的文件中中,返回值为实际写入的字节。
④定位
int lseek(int fd,offset_t offset,int whence); 对于随机文件,我们可以随机的指定位置对文件进行读写。lseek()将文件读写指针相对whence移动offset个字节。操作成功时,返回指定文件指针相对于文件头的位置。参数whence可以使用以下值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset可取负值
⑤关闭
int close(int fd); 操作完成后,关闭文件。
C库文件操作
①创建和打开
FILE *fopen(const char *filename,const char *mode); 打开指定文件filename,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 fprintf(FILE *stream,const char *format,...);
int fscanf(FILE *stream,const char *format,...);
size_t fread(void *ptr,size_t size,size_t n,FILE *stream); //此函数实现从流stream中读取n个字段,每个字段为size个字节,并将读取的字段放入ptr所指的字符数组中,返回时机已读取的字段数。可通过feof()和ferror()来判断函数调用时出现的错误。
size_t fwrite(const void *ptr,size_t size,size_t n,FILE *stream); //此函数实现从缓冲区ptr所指的数组中把n个字段写入到流stream中,每个字段长为size个字节,返回实际写入的字段数。
③关闭
int fclose(FILE *stream);