学习目标:
1、Linux上的文件操作函数
学习内容:
1、Linux上的文件操作函数
库函数和系统调用
库函数的实现是在函数库中,调用执行时,是在用户空间。 — 单次执行时,很快; 多次执行时,在两个空间反复横跳,就不好了
系统调用实现是在系统内核中,调用执行时,是在内核空间。(Windows的API)— 多次调用就可能会快一点
Linux上的操作文件的系统调用
windows: fopen fread fwrite fseek fclose — 库函数
Linux:open read write lseek close || stat lstat fstat creat unlink link fcntl – 系统调用
man的使用
man 命令
man 2 系统调用
man 3 库函数
C语言中的库函数:
FILE* fopen(const char *filename,const char *mode); //mode:"rw"
FILE* fread(char *buf,size_t size,size_t count,FILE* fp);
FILE* fwrite(char *buf,size_t size,size_t count,FILE* fp);
int fssek(FILE* fp,int offset,int whence); //移动读写游标
//flag: SEEK_SET SEEK_CUR SEEK_END
int fclose(FILE *fp);
char* fgets(char *s, int size, FILE *sfp); //fp: stdin stdout
linux 的系统调用:
int open(const char *path, int oflag, /*int mode*/);
/*
path : 文件名
O_RDONLY:只读模式;O_WRONLY:只写模式;O_RDWR:可读可写 ;
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
以下三个常量同样是选用的,它们用于同步输入输出
O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
mode : 只有flag设置了O_CREAT,才选mode,指定新创建文件的访问权限
返回值:如果失败返回-1,并设置全局erron
成功返回文件描述符 大于等于0
*/
int read(int fildes, void *buf, size_t size);
/*
files:是open打开的文件描述符,并且必须以读的方式打开
buf:用户缓存区的首地址,用于保存读取到的数据
size:一次最大读取的字节长度,一般是buf的大小
返回值:失败返回-1 成功返回的是真正读取到的字节长度
*/
int write(int fildes, void *buf, size_t size);
/*
buf:需要写入到文件中的数据的首地址
size:buf中真实数据的长度
返回值:失败返回-1 成功返回的是真正写入到文件中的数据长度
*/
int lseek(int fd,int offset,int whence);
/*
//flag: SEEK_SET SEEK_CUR SEEK_END
*/
int close(int fd);
//复制现存文件
int dup(int fildes);
int dup2(int fildes, int fildes2);
节后练习:
-
实现cat的现实文件内容的功能:
对比 -
利用操作文件系统调用 实现cp命令
输出:
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
//main : ./mian filename
int main(int argc,char *argv[])
{
if(argc!=3)
{
printf("The number of file is error\n");
exit(0);
}
char buf[128]={0};
int fd,fd1,fd2;
int len;
fd1=open(argv[1],O_RDONLY);
if(fd1!=-1)
{
fd=creat(argv[2],0775);
if(fd!=-1)
{
fd2=open(argv[2],O_WRONLY);
while((len=read(fd1,buf,127)) > 0)
{
write(fd2,buf,len);
}
}
else{
printf("error\n");
}
}
else{
printf("File is error\n");
}
return 0;
}
学习记录小点:
1、数组的特殊初始化方法