11.文件io及库

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

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/80978201
今日推荐