文件描述符:
- 文件的打开或创建,内核都会向进程返回一个非负整数(文件描述符)供用户对其进行操作read,write
- 系统默认0,1,2分别为标准输入,标准输出,标准错误
- 程序运行通过文件描述符来区分不同的文件
- 文件描述符仅作用在当前进程
- open或create,成功返回文件描述符,失败返回-1
静态文件和动态文件:
静态文件:文件存在块设备中的文件系统文件的,就是静态文件
动态文件:当我们去open一个文件时,Linux内核在进程建立一个打开文件的数据结构,记录该文件的信息,这就是动态文件
- 打开文件后,对文件的读写的对象是该动态文件
- 我们对文件的读写后,动态文件和块设备的静态文件不同步了,通过close内部内核将内存中的动态文件更新到静态文件
- 块设备不灵活,是按块读写,而动态文件则是按字节读写,所以我们一般对动态文件操作
文件操作的api:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//成功返回文件描述符,失败返回-1
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int creat(const char *pathname,mode_t mode);
void close(int fd);
Pathname:要打开的文件名(包含路径,缺省为当前路径)
Flags:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:可读可写打开
以上权限应当只指定一个,下列权限为可选择的
O_CREAT:若文件不存在则创建它,使用此项时,需同时说明第三个参数mode,说明新文件的存取许可权限
O_EXCL:如果同时指定O_CREAT,而文件存在,则出错
O_APPEND:每次write都加到文件末端
O_TRUNC:write时,清空原有的文件内容,再写新内容
Mode:一定是在使用O_CREAT标志,mode记录待创建文件的访问权限
#include <unistd.h>
//返回写入/读出的字节大小
ssize_t write(int fd,const void *buf,size_t count);
ssize_t write(int fd,const void *buf,size_t count);
off_t lseek(int fd,off_t offset,int whence);//返回指定位置和当前位置距离单位
Whence:指定光标位置
SEEK_SET
文件头部
SEEK_CUR
当前位置
SEEK_END
文件尾部
Offset:光标相对whence偏移单位,负数向前偏移,正数向后偏移
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd;
char r_Buf[128] = {'\0'};
char w_Buf = "hello,world!";
fd = open("file1",O_RDWR|O_CREAT,0600);
if(fd == -1){
printf("open file1 failed\n");
exit(-1);
}
int n_write = write(fd,w_Buf,strlen(w_Buf));
lseek(fd,0,SEEK_SET);
int n_read = read(fd,r_Buf,n_write);
printf("content = %s\n",r_Buf);
close(fd);
return 0;
}
cp实现源码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
if(argc != 3){
printf("parram error!!\n");
exit(-1);
}
int fdSrc;
int fdDes;
int size;
char *readBuf = NULL;
fdSrc = open(argv[1],O_RDWR);
size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf = (char *)malloc(size+1);
int n_read = read(fdSrc,readBuf,size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
int n_write = write(fdDes,readBUf,size);
close(fdSrc);
close(fdDes);
return 0;
}