系统调用接口练习:
代码实现:
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<string.h>
#include<error.h>
int main()
{
umask(0);
int fd=open("./iotest.txt",O_RDWR|O_CREAT|O_APPEND,0664);
if(fd<0)
{
perror("open error");
return ;
}
//ssize_t write(int fd, const void *buf, size_t count);
//要写入的数据
char* data="我最爱陆子涵!\n";
ssize_t a=write(fd,data,strlen(data));
if(a<0)
{
perror("write error");
return ;
}
//ssize_t read(int fd, void *buf, size_t count);
//buf是被读取的数据要放入的地方
char buf[1024]={0};
a=read(fd,buf,1023);
if(a<0)
{
perror("read erroe");
return ;
}
printf("%s",buf);
close(fd);
return 0;
}
代码测试运行图:
第一条最开始没加\n
修改符号追加写入:
截断之前数据写入:
动态库与静态库:
库文件其实就是一大堆已经编译完成的代码文件,通过链接这个库,进而获取相应的函数实现
动态库生成:
gcc --share 表示生成的动态库,不是可执行程序
gcc --share child1.c child2.c -o libmychild.so
命名方式: 前缀lib+名字+后缀.so
gcc -fPIC -c 生成目标代码时,产生位置无关码
动态库被加载到物理内存,映射到栈和堆之间的共享区,映射地址不固定
静态库生成:
ar -cr libmychild.a child1.o child2.o
ar是静态库生成链接器 -c是创建静态库 -r是模块替换 后面紧跟库名称
库的使用:
gcc默认链接方式是动态库
1.生成可执行程序时—链接库文件的搜索路径 /lib64
<1>生成一个可执行程序时,若需要链接一个第三方库,需要将这个第三方库放置到指定路径下
/lib64 或/usr/lib64
<2>也可以使用export LIBRARY_PATH=. 环境变量的设置,来设置库的搜索路径
<3>gcc的-L选项 可以指定链接时的库的搜索路径,不可以指定加载的搜索路径,所以加载不了
-L之后和路径有空格
2.运行可执行程序时—加载动态库的搜索路径 /lib64
gcc -o main main.c -lcalculate -l+中间名称,不需要前缀和后缀
ldd 查看当前程序依赖的库 LIBRARY_PATH 库的链接搜索路径
LD_LIBRARY_PATH 加载库的搜索路径
<1>程序运行时,若程序时动态链接生成,运行时需要到指定的目录下加载动态库
/lib64 或/usr/lib64
<2>也可使用export LD_LIBRARY_PATH=. 环境变量的设置,来声明程序运行时库的加载路径
代码实现:
编写4个不同的函数,生成.o文件,根据指令生成动态库和静态库
创建main函数进行测试:
#include "Add.h"
#include "Sub.h"
#include"Mul.h"
#include"Div.h"
#include<stdio.h>
int main()
{
printf("Add(1,2):%d \n",Add(1,2));
printf("Sub(5,2):%d \n",Sub(5,2));
printf("Div(4,2):%d \n",Div(4,2));
printf("Mul(2,4):%d \n",Mul(2,4));
}
代码测试运行图:
动态库测试:
静态库测试: