Linux
头文件守卫,防止头文件重复包含。
#ifnedf HEAD_H
#define HEAD_H
…
#endif
压缩,解压
1安装 sudo apt-get install 软件名字
2卸载 sudo apt-get remove 软件名
3安装包 .deb
要生成的压缩包名------>test.tar.gz
-
tar方式
- 压缩
tar zcvf 要生成的压缩包名 压缩材料 gzip方式压缩 - 压缩
tar jcvf 要生成的压缩包名 压缩材料 bzip方式压
- 压缩
-
rar方式
- 压缩
rar a -r 要生成的压缩包名 压缩材料 - 解压
unrar x 压缩包
- 压缩
-
zip方式
-
压缩
zip -r 压缩包名 压缩材料
列如 zip -r testzip.zip dir hello.c -
解压
unzip 压缩包名
列如 zip testzip.zip
静态库制作及步骤
**1.**将.c生成.o文件
gcc -c add.c -o add.
**2.**使用ar工具制作静态库
ar rcs lib库名.a add.o sub.o dir.o
**3.**编译静态库到可执行文件中
gcc test.c lib库名.a -o a.out
动态库制作及使用
**1.**将.c生成.o文件(生成与位置无关的代码,-fPIC)
gcc -c add.c -o add.o -fPIC
**2.**使用使用gcc -shared 制作动态库
gcc -shared lib库名.so add.o sub.o dir.o
**3.**编译可执程序时,指定所使用的动态库。-l指定库名(去掉前缀lib和.so后缀) -L 指定库路径
gcc test.c -o a.out -l mymath -L ./lib
4运行可以执行程序,但是./a.out出错
- 原因
-
链接器 工作于链接阶段。 工作需要 -l -L
-
动态链接器。工作与程序运行阶段。工作时需要提供动态链接库所在外置。
解决方法
【1】通过环境变量:export LD_LIBRARY_PATH= 动态库路径。
- ./a.out成功 (临时文件。重启终端环境变量失效。)
【2】永久生效写入终端配置文件,.bashrc 建议使用绝对路径。
-
vi ~/.bashrc
* 写入export LD_LIBRARY_PATH=动态路径。保存。
-
…bashrc/ source .bashrc/ 重启终端—>让修改后的.bashrc生效。
-
./a.out 成功
【3】拷贝自定义动态库到/lib目录(标准c库所在目录文件)
【4】配置文件法
- sudo vi /etc/ld.so conf
- 写入动态库绝对路径 保存
- sudo ldconfig -v 使用配置文件生效
- ./a.out 成功 使用 ldd a.out查看
Makefile管理项目
1个规则
-
目标:依赖条件(一个tab缩进)
- 1.目标的时候必须晚于依赖条件的时间,否则,更新目录
- 2.依赖条件如果不存在,寻找新的规则去产生依赖条件
-
ALL: 指定Makefile的终极目录
2个函数
- src=$(wildcard ./*.c):匹配当前工作目录下的所有.c文件,将文件名组成列表,赋值给变量src。 src=add.c sub.c div.c
- obj=$(patsubst %.c %.o $(src)):将参数3中,包含参数1的部分,替换为参数2,obj=add.0 sub .0 div.o
- clean:(没有依赖)
- -rm -rf $(obj) a.out “-”,作用是,删除不存在的文件时,不报错,顺序执行结束
3个自动变量
* $@:代表目录, 在规则的命令中,表示规则的目录
-
$^:在规则命令中,表示所有依赖条件
-
$<:在规则的命令中,表示第一个依赖条件,如果将变量应用在模式规则中,它可依赖条件列表中的依赖次取出,套用模式规则
-
模式规则
%.o:%.c
gcc -c $< -o $@
-
静态模式规则
$(obj):%.o:%.c
gcc -c $< -o $@
-
伪目标
.PHONY :clear ALL
open 函数
1 int open(char pathname,int flags)*
- 参数
- pathname:欲打开的文件路径
- flags;文件打开方式:#include<fcntl.h>
- O_RDONLY|O_WRONLY
- 返回值
- 成功 :打开文件所的到对应的文件描述符(整数)
- 失败:-1 设置error
- int open(char *pathname,int flags,mode_t mode)
- 参数
- pathname 欲打开的文件路径flags;
- flags;文件打开方式O_RDONLY|O_WRONLY#include<fcntl.h>
- mode:参数3使用的前提,参数2指定了O_CREAT, 文件权限
- 返回值
- 成功:打开文件所得到对应的文件描述符,
- 失败:-1设置error
read函数
-
ssize_t(int fd,void *buf,size_t count);
-
参数:
- fd:文件描述符
- buf:存数据的缓存区
- count:缓存区大小
-
返回值
- 0:文件末尾。
- 成功:>0读到的字节数
- 失败:-1,设置error
- -1:并且error=EAGIN或者EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据,
文件描述符
PCB 进程控制块 本质 结构体
- 成员 :文件描述符表
- 文件描述符,1/2/3/4…/1023 表中可用的最小的
- 0----STDIN_FILENO
- 1----STDOUT_FILENO
- 2----STDERR_FILEND
阻塞,非阻塞
是设备文件,网络文件的属性
- 产生阻塞的场景,读设备文件,网络文件(读常规文件无阻塞概念)
- /dev/tty----终端文件
- open("/dev/tty",O_RDWR|O_NONBLOCK)--------设置 /dev/tty 非阻塞状态(默认为阻塞状态)
fcntl
- int flgs=fcntl(fd,f_GETFL);
- 获取文件状态:F_GETFL
- 设置文件状态:F_SETFL
stat 函数
inode节点与目录项
-
ls -i filename 可以查看文件对应的inode编号
-
vi +n filename 打开文件,直接显示 第n行
-
struct stat *buf 传出参数,定义 struct stat sb; &sb
-
stat函数参数
- int stat(const char *pathname, struct stat *buf);
- 参数:
- pathname:文件路径
- buf:存放文件属性
-
返回值
- 成功返回0,
- 失败返回-1
-
获取文件大小:buf.st_size;
-
获取文件类型:buf.st_mode
-
获取文件权限:buf.st_mode
-
符号穿透:stat会,lstat不会
link创建硬链接
- int link(const char *oldpath, const char *newpath);
- oldpath 原文件
- newpath 硬链接文件