linux高级编程(文件操作)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件及设备操作
1.基本概念
linux下文件操作的两种方法:原始文件I/O、标准I/O库
标准I/O库: 是C语言的标准输入输出库,是针对流对象FILE 进行的操作,是带缓存的。
原始I/O库:是linux系统提供的文件API,是针对描述描进行的操作,是无缓存机制。
文件描述符:创建一个新文件或打开现有文件时,内核向进程返回的一个非负整数。
其范围在0~OPENMAX之间,OPENMAX是一个宏,不同linux版本取值不同.
系统调用:是操作系统提供的某些功能的接口(函数)
常用设备
/dev/null 空设备,丢弃数据用
/dev/port 存取I/O端口
/dev/ttyN N(0 1 ...) 字符终端
/dev/sdaN N(0 1...) SCSI磁盘
/dev/scdN N(0 1...) SCSI光驱
/dev/mouseN N(0 1...) 鼠标
/dev/socksys 套接字访问端口接口,用于网络传输
/dev/route 路由器控制设备
/dev/fbN N(0 1...) 帧缓冲设备(frame buffer) 重点
/dev/mixer 混音器音量控制、混音控制重点
/dev/dsp 声卡数字采样和数字录音设备用于播放声音和录音经常使用重点(oss)
/dev/audio 声卡音频设备用于播放声音和录音,支持sun音频较少使用
/dev/video 视频摄像头用于视频采样(录像)
常用头文件
#include
#include
#include
#include
#include
#include
#include
#include
2.设备的操作函数
#include
#include
#include
#include
#include
1)Access
功能: 确定文件的访问权限
用法: int access(const char *filename, int amode);
finename 文件名称mode 模式,共5种模式:
0-检查文件是否存在
1-检查文件是否可运行
2-检查文件是否可写访问
4-检查文件是否可读访问
6-检查文件是否可读/写访问
例:判断文件是否存在
int file_exists(char *filename){
return (access(filename, 0) == 0);
}
2)创建文件
int creat(char *pathname,mode_t mode);
pathname:要创建文件的路径文件名。可以使用绝对路径或相对路径。
mode: 新建文件的访问权限,同创建目录
使用时,可用或运算组合使用,如
S_IRUSR | SIWUSR
写可以使用数字,如
666
返回值:成功,返回文件描述符,失败-1
说明:
3)打开文件
int open(const char *pathname, int oflag,mode_t mode);
pathname: 设备或文件名
flags: 文件的打开方式,可以用位运算|组合
O_RDONL Y 只读
O_WRONL Y 只写
O_RDWR 读写模式
O_APPEND 追加模式
O_CREAT 创建文件
O_SYNC 同步。
O_NONBLOCK 非阻塞模式,默认为阻塞模式
O_EXCL 如果定义了O_CREAT,且文件已存在,则出错
O_TRUNC 如果文件存在,且以只读或指写方式打开,则截断文件mode: 可选参数,用于定义新建文件的访问权限,同creat函数
返回值:成功文件描述符失败-1
注:O_RDONL Y、O_WRONL Y、O_RDWR中只能选择一个,然后通过|运算和其它选项组合
O_EXCL与O_CREAT组合实现互斥,文件已存在的情况下,调用失败。
O_WRONL Y|O_CREAT|O_TRUNC组合,则与creat函数等价
对于设备文件,不能使用O_CREAT选项
例:int fd=open("./test.txt",O_CREAT | O_RDWR | O_SYNC);//文件
int fd=open("/dev/dsp",O_RDWR | O_SYNC); //设备
4)文件读写
ssize_t write(int filedes,void *buff, size_t nbytes);
ssize_t read(int filedes,void *buff, size_t nbytes);
filedes: 文件描述符
buff:内存地址,如果用write,则先在buff内填写数据
如果用read,则先准备好一个内存,等待填写
nbytes:要读写的字节数
返回值:成功是实际的读写长度失败-1
注:read、write不仅用于读取文件,而且用于套接字、设备等。
5)文件的关闭
int close(int filedes);
6)文件的删除
int unlink(const char * path)
说明:只是将文件的引用计数减一,只有在引用计数变为0的情况下,才会删除物理文件
7)移动文件指针
off_t lseek(int fd,off_t offset,int whence);
fd:文件描述符
offset: 文件偏移量,是相对于whence的偏移
whence: 文件偏移的起始位置
SEEK_SET 文件头
SEEK_CUR 当前位置
SEEK_END 文件尾开始
返回值:成功,返回新的当前文件指针位置,失败-1
8)设备控制(设置)
#include
int ioctl(int d, int request, ...);
d: 文件枸柄(描述符)
request:用户程序对设备的控制命令,后面的省略号,是补充参数,一般最多一个
返回值:成功0 失败-1
例:int fd=open("/dev/dsp",O_RDWR); //打开设备
int format=8; //音频采样大小