AM
一、make与makefile
1.回顾:
目标的语法
目标名:依赖目标
@命令
@命令
make的命令行使用
make-f make 脚本文件目标名
2.目标的划分
目标依赖
3.默认规则:
a.不指定目标,默认执行第一个目标
b.不指定make文件,默认文件是makefile或者是Makefile(makefile优先)
4.目标的调用规则:(make把目标当作文件)
make执行目标:
搜索与目标相同的文件
如果文件存在,则判定日期。
日期最新,则停止执行,输出提示
日期不是最新,则进行执行
比较:当前目标与依赖目标
如果当前目标有
5.建议:
只要有文件输入出,就把任务作为一个目标,并且把输出的文件作为目标名。 ==
每一个编译结果作为一个目标,并且把编译结果作为目标名。
6.潜规则(不建议)
.c目标与.o目标
首先查找.o目标,目标如果不存在,就把.o替换成.c
如果.c存在,实施潜规则:直接调用gcc把.c执行为.o
7.变量
变量名=值值
$(变量名) ${变量名} 变量名可以是用户定义的也可以是环境变量
8.伪目标
不把目标作为文件处理的目标称为伪目标
声明伪目标:.PHONY:clean
没有:
1.make的配置
2.make的变量的操作函数
3.多make文件使用
二、环境变量
访问环境变量的方式:
1.使用main的参数
intmain(int args, char **argv, char **arge)
{
}
二维数组循环
命令行参数argv与环境行arge都是字符数组。
约定:最后一个字符串实际上是NULL/0
2.在C的标准库提供:外部变量
externchar **environ;
3.修改获取某个环境变量
getenv/setenv/unsetenv
三、IO的基础
1.认识内核对象
不允许访问内核设备和内存,
但可以通过内核系统函数去访问。
对每个内核对象进行编号ID。
如果访问内核对象,只能通过ID。
编程模型:
申请得到一个ID
在内核系统函数中使用ID得到对应内核对象数据
2.怎么访问文件
使用函数,传递一个文件,系统打开文件,加载文件数据,返回一个ID,
使用函数,传递一个ID,得到数据
使用函数传递ID,告诉系统释放文件。
ID:文件描述符号。 filedescription(fd)
每一个程序执行的时候都有一个目录,存放打开的文件描述符
3.每个程序默认打开三个文件设备 (cd /proc/25967/fd/) fd
0:标准输入
1:标准输出
2:错误输出
4.操作文件描述符
ssize_twrite(int fd,
void*buf, //要写入内核对象的数据
size_tsize,) //写入数据的大小
返回值:
>0实际写入的数据
=-1写入错误
ssize_tread(int fd,
void*buf, //返回数据的空间
size_tsize); //空间大小
返回值:
>0:实际读取的数据
=0:碰到文件结束符号EOF(CTRL+D)
=-1:读取错误
建议:
0:输入
1:输出
2:错误输出
课堂练习:
1.使用write向0 1 2写数据
2.使用read从0 1 读取数据,并判定输入的情况,然后根据相应的结果输出提示
PM
三、基于文件的描述符号
1.得到文件描述符号/释放文件描述符
a.文件类型
目录文件 d
普通文件 f
字符设备文件 c
块设备文件 b
软连接文件 l(符号连接文件)
管道文件 p
socket文件 s
b.文件的属性
1.字符表达方式:字符模式: chmodu+w aa.c 绝对方式 chmod 777 aa.c
0 0 0 0
拥有者 组 其他用户
2.文件的权限属性:
读
写
执行
占附位权限
用户设置权限
组设置权限
0 0 0 0 0
特殊权限 拥有者 组 其他用户
s:
S:
t:
T:
2.1s设置位
2:组设置位
4:用户设置位
s对执行文件
无效的设置位使用S表示
设置位向其他用户开放拥有者权限的权限,用户设置位
设置位向其他用户开放组用户权限的权限,组用户设置位
设置位只对执行程序有意义(执行权限有意义)
2.2t设置位
1:表示沾附位设置
t对写文件有意义
无效的沾附位使用T表示
沾附的目的:防止有权限的用户删除文件
程序在执行的时候到底拥有的是执行者的权限,还是文件拥有者的权限。
程序执行过程中有两个用户:
实际用户:
c.
2.通过文件描述符号读写数据
3.文件的概念与重定向
Demo.mk |
compile: gcc -c -fpic input.c gcc -c -fpic primer.c lnk: compile gcc -shared -olibdemo.so input.o primer.o demo:lnk gcc demo.c -ldemo -l -omain |
Make –f demo.mk demo |
|
Makefile文件中的变量
makefile |
input.o: input.c gcc -c -fpic input.c primer.o: primer.c gcc -c -fpic primer.c libdemo.so: input.o primer.o gcc -shared -olibdemo.so input.o primer.o demo:demo.c libdemo.so gcc demo.c -ldemo -l -omain |
makefile |
OBJ=input.o primer.o
input.o: input.c gcc -c -fpic input.c primer.o: primer.c gcc -c -fpic primer.c libdemo.so: $(OBJ) gcc -shared -olibdemo.so $(OBJ) demo:demo.c libdemo.so gcc demo.c -ldemo -l -omain |
Env.c |
#include<stdio.h> int main(int args, char **argv, char **arge) { while(*arge) { printf("%s\n", *arge); arge ++; } } |
env: env.c gcc env.c -omain
clean: rm -f main *.o |
Env2.c |
#include<stdio.h> int main(int args, char *argv[], char *arge[]) { int i = 0; while(arge[i]) { printf("%s\n", arge[i]); i ++; } } |
Env3.c |
#include<stdio.h> #include<unistd.h> extern char **environ; int main() { while(*environ) { printf("%s\n", *environ); environ ++; } } |
Fd.c |
#include<stdlib.h> #include<stdio.h>
main() { printf("%d\n", getpid()); while(1); } |
执行结果 |
Write1.c |
#include<stdlib.h> #include<stdio.h>
main() { write(0,"Hello\n", 6); write(1,"world\n", 6); write(2,"louis\n", 6); } |
Read1.c |
#include<stdlib.h> #include<stdio.h>
main() { char buf[32]; int r = read(0, buf, 30); printf("实际输入:%d\n",r); if(r > 0) { buf[r]=0; printf("::%s\n", buf); } if(r == 0) { printf("ctrl+d\n"); } if(r == -1) { printf("输入错误"); }
} |
Chmod |
|
Main |
a.txt |
赵 |
Rwx |
Rw |
张 |
X |
r |
问题:当张执行main时能否对a.txt写?
答案:不允许