一、make与makefile
1、回顾:
目标的语法
目标名:依赖目标
@命令
@命令
make的命令行使用
make -f make脚本文件 目标名
2、目标的划分
目标依赖
3、默认规则:
a、不指定目标:执行第一个目标
b、不指定make文件,默认文件是makefile(优先)或Makefile
4、目标的调用规则:(make把目标当做文件)
make执行目标:
搜索与目标相同的文件
如果文件存在,则判定日期。
日期最新,则停止执行,输出提示。
日期不是最新,则进行执行
比较:当前目标与依赖目标
5、建议:
每个编译的结果作为一个目标// 只要有文件输出,就把任务作为一个目标
并且把编译结果作为目标名 //并且把输出的文件作为目标名
6、潜规则
.c .o 查找.o目标,目标不存在,就把.o替换成.c 如果.c存在,实施潜规则:直接调用gcc把.c执行成.o
7、变量
变量名 = 值 值 $(变量名) $ {变量} echo $(PATH)
8、伪目标 :不把目标作为文件处理的目标称为伪目标
声明伪目标 .PHONY:
make的配置、make的变量的操作函数、多make文件使用
二、环境变量
1、直接使用main的参数
命令行参数argv与环境行arge都是字符串数组
约定:最后一个字符串是NULL/0
2、在C的标准库提供:外部变量(extern char **environ;)
3、修改环境变量获取某个环境变量 getenv/setenv/unsetenv
三、IO的基础
1、认识内核对象
不允许访问内核设备和内存,但可以通过内核系统函数去访问,对每个内核对象进行编号ID。
如果访问内核对象:只能通过ID。
编程模型:
申请得到一个ID;在内核系统函数中使用ID得到对应的内核对象数据;
2、怎么访问文件
使用内核函数,传递一个文件,系统打开文件 加载文件数据,返回一个ID。
使用函数,传递ID,得到数据。使用函数ID,告诉系统释放文件。
ID(文件描述符号) file description(fd)
每个程序执行的时候都有一个目录,存放打开的文件描述符
3、每个程序默认打开三个文件设备:
0、标准输入 1、标准输出 2、错误输出
4、操作文件描述符号
ssize_t write (int fd, void *buf, size_ t size);
返回:>0 实际写入的数据 -1写入错误
ssize_t read(int fd, void *buf, size_ t size);
返回: >0 实际读取的数据 =0:碰到文件结束符号EOF(ctrl + d) -1:读取错误
建议:
0:输入 1:输出 2:错误输入
四、基于文件的描述符号
1、得到文件描述符号/关闭释放文件描述符号
a.文件类型
目录文件d
普通文件f
字符设备文件c
块设备文件b
符号连接文件(软连接)l
管道文件p
socket文件s
b.文件的属性
属性的表达方式:绝对模式、字符模式
文件的权限属性:
读 写 执行 粘附位权限 用户设置位权限 组设置位权限
0 0 0 0 0
特殊权限 owner group other
设置位向其他用户开放拥有者权限的权限 用户设置位
设置位向其他用户开放组用户权限的权限 组用户设置位
设置位只对执行程序有意义(执行权限)
s设置位 2:组设置位 4:用户设置位 s对执行有效,无效的设置位使用S表示
t 设置位 1:表示粘附位设置 t 对写文件有意义,无效的粘附位使用T表示
粘附的目的:防止有些权限的用户删除文件。
程序在执行的时候到底拥有的是执行者用户还是文件拥有者的权限
2、通过文件描述符号读写各种数据
3、文件描述符号与重定向