. 文件IO
a.对比一下文件IO和标准IO ***
文件IO是系统调用,标准IO是c语言库函数
文件IO使用文件描述符,标准IO使用FILE*文件流
文件IO不带缓冲,标准IO带缓冲
文件IO多用于操作设备文件,标准IO一般多用于操作普通文件
b. 内核中有一个文件表项,保存了已经打开的文件的相关信息
c. 文件IO要用文件描述符对文件进行操作
文件描述符是一个非负整数,stdin->0, stdout->1, stderr->2
d. 文件操作步骤
[创建]打开文件
操作文件 read/write/ioctl
关闭文件
e. 相关的函数
打开文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数 :
pathname : 文件名
flags : 打开方式,必须包含以下三个中的一个O_RDONLY,O_WRONLY,O_RDWR
O_CREAT : 创建文件
O_TRUNC : 创建文件时,清空文件内容
O_NONBLOCK or O_NDELAY :非阻塞打开
O_EXCL : 文件存在的情况下创建该文件,会打开失败
mode : 权限,在创建文件的时候,需要指明权限。一般用8进制表示。
返回值:成功时,返回非负整数;失败时,返回-1。
读文件内容
size_t read( int fd, void * buf, size_t size);
参数:
fd : 文件描述符,是open的返回值
buf : 读到的数据保存在buf中
size : 准备读取的数据长度
返回值:成功时,返回读到的字节数;失败时,返回-1。
写内容到文件中
size_t write( int fd, const void * buf, size_t size);
参数:
fd : 文件描述符,是open的返回值
buf : 准备写的数据保存在buf中
size : 准备写的数据长度
返回值:成功时,返回写入的字节数;失败时,返回-1。
关闭文件
int close( int fd );
参数:
fd : 文件描述符,是open的返回值
返回值:成功时,返回0;失败时,返回-1。
2. 空洞文件
新建文件,内容是空的,但大小已经占位。
long lseek( int fd, int offset, int whence );
==> fseek() + ftell();
-
文件属性
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int stat(const char *path, struct stat *buf);
ls是一个可执行文件,在/bin目录; ls -l 本质是运行一个文件,这个文件名叫"ls","-l"相当于给ls传的参数
./a.out 1.txt -
目录操作
目录是一种特殊的文件,它是用于存放其它文件的。
操作步骤:
打开目录
操作目录 读目录、改名、新建文件、删除文件
关闭目录
相关的函数
#include <sys/types.h>
#include <dirent.h>DIR *opendir(const char *name); struct dirent *readdir(DIR *dirp); int closedir(DIR *dirp); int rename(const char *oldpath, const char *newpath); int remove(const char *pathname);
-
静态库和动态库
什么是库
可执行代码的二进制形式。
特点 ****
什么时候链接
静态库在编译时链接
动态库在运行时链接
在运行程序时,是否需要库
静态库不需要
动态库需要
是否需要移植
静态库不需要移植
动态库需要进行移植
可执行文件size的大小
静态库编译后的文件size大
动态库编译后的文件size小
库文件升级
静态库需要重新编译可执行文件
动态库需要移植新的库,不需要重新编译
制作和使用
例:将hello.c制作成静态库,main.c调用hello.c中的函数
静态库
1. 先将库对应的.c编译成.o文件
gcc -c hello.c -o hello.o
2. 将.o文件打包成静态库[静态库的前缀是lib,扩展名.a]
ar crs libmyLib.a hello.o
3. 在编译main.c时,链接静态库
gcc main.c -lmyLib -L./ -o main
4. 运行可执行文件,进行测试
./main
动态库
1. 先将库对应的.c编译成.o文件
gcc -fPIC -Wall hello.c -o hello.o
2. 将.o文件打包成动态库[动态库的前缀是lib,扩展名.so]
gcc -shared hello.o -o libHello.so
3. 编译main.c时,链接动态库
gcc main.c ./libHello.so -o main
4. 运行可执行文件,进行测试
./main