1、文件描述符
一个终端会默认打开3个流:stdin stdout stderr,这三个流是操作标准io的;
一个终端同样会默认打开3个文件描述符:0 1 2
2、打开文件
int open(const char *pathname,int flag);
flag(打开方式):O_RDONLY(只读) O_WRONLY(只写) O_RDWR(读写) 这三个是互斥的
O_CREAT(创建) O_TRUNC(清空) O_APPEND(追加)
O_EXCL(文件存在报错,但是和O_CREAT一起使用才有意义)
O_ASYNC O_SYNC O_NONBLOCK
fopen("1.txt","r");<==> open("1.txt",O_RDONLY);
fopen("1.txt","r+");<==> open("1.txt",O_RDWR); // open("1.txt",O_WRONLY);
fopen("1.txt","w");<==> open("1.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
fopen("1.txt","w+");<==> open("1.txt",O_RDWR | O_CREAT | O_TRUNC,0664);
fopen("1.txt","a");<==> open("1.txt",O_WRONLY | O_CREAT | O_APPEND,0664);
fopen("1.txt","a+");<==> open("1.txt",O_RDWR | O_CREAT | O_APPEND,0664);
3、
int stat(const char *file_name,struct stat *buf):
通过文件名file_name获取文件信息,并保存在buf所指的结构体stat中 执行成返回0,失败返回-1
头文件:#include<sys/stat.h>,#
opendir()
readir()
system()
4、库
什么是库:通过一定的方式编译生成的二进制文件
什么是头文件:用来存放函数声明、宏定义、类型定义
库的分类:静态库和动态库(共享库)
静态库:1、使用静态库的时候,会将静态库的信息直接编译到可执行文件中
2、优点:当静态库被删除,对可执行文件没有影响
3、缺点:浪费内存空间。如果静态库被修改,可执行程序要重新编译
动态库: 1、编译的时候可执行程序不会存放动态库信息,执行的时候需要执行到相应函数位置才会链接动态库的信息到内存
2、如果多个可执行程序使用相同的动态库,一旦一个可执行程序链接过动态库,其他的可执行程序会直接共享之前链接的动态库
静态库的命名方式:lib库名.a
动态库的命名方式:lib库名.so.主版本号.副版本号
静态库的产生过程:
1、gcc -c add.c -o add.o
2、ar -cr lib库名.a 相应的.o文件
-c创建 -r替换
静态库的执行方法:
1、静态库没有放在系统默认路径下(/lib或者/usr/lib):
gcc main.c 库的路径/库
2、静态库存放在系统路径下:
gcc main.c -l 库名字
动态库的产生过程:
1、gcc -fpic(位置无关码) -c add.c -o add.o
2、gcc -shared -o lib库名.so 相应的.o文件
动态库的执行方法:
1、动态库没有放在系统默认路径下:
gcc main.c 库的路径/库
2、动态库放在系统默认路径下:
gcc main.c -l 库名字
如果编译之后可执行文件不能正常执行:
解决方式:
1、/etc/bash.bashrc下添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库绝对路径
2、在/etc/ld.so.conf.d/目录下任意创建一个以.conf结尾的配置文件,
在.conf文件中添加上动态库的绝对路径
最后要执行:sudo ldconfig