linux下高级编程的特点;涉及到内核向用户空间提供的接口(函数)
接口的功能 参数 返回值
文件IO
头文件:unistd.h fcntl.h
是从用户空间角度考虑的输入输出
从内核读数据或从文件中读数据叫 输入 read函数
写数据到内核或写数据到文件中叫 输出 write 函数
打开或创建一个文件 open函数
关闭一个文件 close函数
open(char*,flag,mode)
char* 要打开的文件名和路径 一般用命令行参数传入(main参数)
{
参数2(flags)
flags分为两类:主类,副类
主类:O_RDONLY 以只读方式打开 / O_WRONLY 以只写方式打开 /O_RDWR 以可读可写方式打开
三这是互斥的
副类:
O_CREAT 如果文件不存在则创建该文件
O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
O_TRUNC 打开一个文件删除文件中原有数据
O_APPEND 以追加的方式打开不删除里面数据
主副可以配合使用,例如:O_RDWR|O_CREAT|O_TRUNC
————————————————
版权声明:本文为CSDN博主「大根菌」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39296438/article/details/79422068
}
返回值 成功返回文件描述符,它是一个非负的正参数 。即文件ID号
出错返回-1
linux中存在掩码umask 可用umask查看也可用umask+xxx来修改
实际值为给定的mode与掩码取反相与
write函数
write(int fd,viod*buf,size)
参数1:写到哪个文件(ID号)
参数2:写的内容
参数3:写多少个字节
返回值是实际写的字节数
read函数
read(int fd,viod*buf,size)
参数1:读那个文件
参数2:读到哪里去
参数3:读多少个字节
返回值是实际读到的字节数
lseek函数
调整读写位置指针 所需头文件:sys/types.h unistd.h
lseek(int fd int offset int whence)
参数1:要调整的文件名
参数2:偏移量
参数3:指针的基准位置
SEEK_SET:基准位置为文件开头,新位置为偏移量大小
SEEK_CUR:基准位置为当前指针的位置。新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾。新位置为文件的大小加上偏移量
返回值,成功为指针当前位置,失败返回-1
## 标准IO
标准IP:应用代码使用C库函数来间接调用内核提供的系统调用函数 头文件stdio.h
文件IO:是直接调用内核提供的系统调用函数unistd.h
输入输出相关函数,都是和标准输入(键盘),标准的输出(显示器)有关,和一些普通文件的读写没有关系,即这些函数不能读写普通文件。
如getchar()putchar() printf scanf
{标准输出文件描述符为1,标准输入为0}
标准IO中有一个库缓存
用户有用户缓存,内核有内核缓存,用write函数是直接从用户缓存到内核缓存,用printf要先送到库缓存再送到内核缓存 printf遇到\n时才会将库缓存内容写到内核缓存中
库缓存分为全缓存行缓存和无缓存三种,行缓存碰到\n写到内核,全缓存为写满缓存再调用系统调用函数写到内核,无缓存只要调用就会立即写到内核
行缓存
读:fgets、gets、printf、fprintf、sprintf
写:fputs、puts、scanf
全缓存
读:fread
写:fwrite
fopen和fclose
FILEfopen(const charpath,const charmode)
返回值:FILE文件流指针 类似于文件IO中的文件描述符
FILE定义:其实是一个结构体struct_IO_FILE,包含读写缓存的首地址 大小 位置指针等
第一个参数是路径
第二个参数类似FLAG
r或rb 打开只读文件,该文件必须存在
r+或r+b 打开可读写的文件,该文件必须存在
w或wb打开只写文件,若文件存在会删除文件内容,若文件不存在则创建
w+或w+b或wb+打开可读写文件,若文件存在清楚内容,不存在则建立文件
a或ab以附加的方式打开只写文件,若不存在则创建
a+或a+b或ab+ 以附加的方式打开可读写文件若不存在则创建。
b:二进制文件
r:以只读方式打开,文件必须存在
w或a:以只写方式打开,文件不村子则创建
w等价于O_TRUNC,a等价于O_APPEND
+以读写方式打开
fopen创捷的文件都会是666,但是会受到umask的影响
会有三个文件流
stdin标准输入
stdout标准输出
stderr标准出错
fputs和fgets
charfgets(chars,int size,FILEstream)
参数一:缓存,即都到哪里去
参数二:读多少个字节
第三个参数:从什么地方读
返回值成功为s(缓存的地址),若在文件尾端或出错则为NULL
int fputs(const chars,FILEstream)
参数一:缓存,即写什么内容
参数二:写到哪里去(或者stdin标准输入stdout标准输出stderr标准出错)
若成功则为非负值,出错则为EOF
fclose关闭一个文件,关闭时会刷新缓存数据,会把已有缓存强制输送出去
stderr为无缓存的
fflush fseek rewind ftell
fflush会强制将库缓存送到内核中
fclose中包换fflush
fflush(FILEfp)
fseek()参数与lseek一样但返回值不同
成功返回0 失败返回 -11
rewind(FILEfp)用于设定流的文件位置指示为文件开头,该函数调用成功无返回值
rewind(fp)等价于fessk(fp,0,SEEK_SET)
ftell(FILEfp)
用于取当前文件位置指针。调用成功则返回当前文件指针位置,出错则为-1L
行缓存读写函数gets puts fprintf sprintf
chargets(chars)
int puts(const char*s)
返回值与fgets fputs相同
gets只能从标准输入读,不能指定长度,可能造成缓存越界 gets不读入新行符,fgets读入新行符。
puts只能向标准输出中写。puts输出时会添加一个新行符(\n )
int fprintf(FILEstream,“字符串格式”)
fprintf既可以向标准输出(显示屏)输出,也可以向文件内输出
int sprintf(str)“字符串格式“输出内容到一个字符串中
**
## 一个字符读写函数fgetc和fputc
**不是行缓存
int fgetc(FILEfp)
将文件中的一个字符输出到显示器,成功返回输出值,到文件结尾时返回EOF
int fputc(int c,FILEfp)
输入一个字符到文件中。成功则返回输入字符,出错返回EOF(实际就是-1)
feof、ferror、clearerr
int feof(FILE*stream)
功能:判断是否已经到文件结束
参数:文件流指针
返回值:到文件结束,返回非零,没有返回0
注意,feof要先读一次才能判断,在用作判断条件时前面应该先读,否则会出现多读一次情况
int ferror(FILEstream)
功能:判断是否读写错误(判断getc等函数是否返回EOF)
参数:文件流指针
返回:是读写错误返回非0不是返回0
void clearerr(FILEstream)
功能,清除流错误
参数:文件流
fread、fwrite 全缓存函数
size_t fread(voidptr,size_t seze ,size_t nmemb,FILEstream)
soze_t fwried(const voidptr,size_t size size_t nmemb.FILEstream)
参数一:缓存地址
参数四:写到那里去/从哪里读
参数二size:写的内容中,每一单元所占的字节数
参数三:nmemb:写的内容中,有多少个单元数
例如charbuf【128】
参数二位1参数三为128
int buf【128】
参数二为4 参数三为128
返回值,实际读写的单元数
头文件
opendir(只能打开目录)
mkdir 创建目录
readdir 都目录(读取到的是目录下的子文件或者子文件的信息,不涉及内容,只包括文件名称,类型等)
rewinddir 调整到开头 调整指针位置
telldir 返回当前位置
seekdir 调整位置
closedir 关闭目录
DIRopendir(const charpathname)
参数:打开的目录以及路径
返回值:成功返回目录流指针,出错返回NULL
int mkdir(const char *path,mode-t mode)
path为欲创建的目录文件路径
mode为该目录的访问权限
返回值,成功返回0,否则返回-1
struct direntreaddir(DIRRdr)
参数目录流指针
返回值:成功则为struct dirent指针,若在目录尾或出错返回NULL
struct dirent定义在头文件dirent.h中
此结构至少包换下列两个成员:
struct dirent
{
ino_t ino; inode号
char d_name[NAME_MAX+10;文件名]
}
void rewinddir(DIR*dr)
参数:目录流指针
重置读取目录的位置为开头
long telldir(DIR*dirp)
参数:目录流指针
返回值:目录流当前位置
void seekdir(DIR*dr,long loc)
参数:目录流指针和偏移量,
练习:单机模式下的文件上传和下载
(1)输入服务器地址:路径和目录名
(2)列出服务器中有哪些文件名或上传文件到服务器的文件名 opendir readdir
(3)输入从服务器下载的文件名 或 上传文件到服务器的文件名
(4)文件下载 或 文件上传
文件IO:open read write close
标准IO:fopen fputs fgets fputc fgetc fread fwrite fclose