首页 > 代码库 > 2017/04/22学习笔记

2017/04/22学习笔记

makefile中的函数

所以得makefile函数都是有返回值的

src=http://www.mamicode.com/$(wildcard ./*.c) #从当前目录查找所有的.c文件
obj=$(patsubst ./%.o, ./%.c, $(src)) #所有.c替换成点o

.PHONY:clean 伪目标
clean:
rm $(obj) $(target) -f #删除.o和 目标 -f强制执行,不提示信息

clean:
-rm $(obj) $target -f #命令前加 -,如果当前目录执行失败,忽略当前目录,继续向下执行

make clean #执行删除操作
伪目标不会执行更新比较操作

C库函数

硬盘为什么慢
大部分硬盘都是机械硬盘,读取寻道时间和写入寻道时间都是毫秒级。
相对来说内存读写速度非常快,因为内存是电子设备,读写速度是纳秒级别的
1秒=1000毫秒
1秒=1000000微秒
1秒=1000000000纳秒 两者相差百万倍

FILE结构体

文件描述符(整型值):索引到对应的磁盘文件
文件读写指针位置:读写文件过程中指针的实际位置
I/O缓冲区(内存地址):数据从内存刷新到磁盘(默认大小8192byte)
1.刷新缓冲区:fflush
2.缓冲区已满
3.正常关闭文件
1.fclose
2.return(main函数)
3.exit(main函数)

Linux每一个运行的程序(进程)操作系统都会为其分配一个0-4G的地址空间(虚拟地址空间)
0-3用户空间
3-4 内核空间

PCB进程控制块:文件描述符表 (0-1023)

每打开一个新文件,则占用一个文件描述符,而且使用的是空闲的最小的一个文件描述符

一个进程默认能打开1024-3个文件 (012默认被使用)
0 STDIN_FILENO 标准输入
1 STDOUT_FILENO 标准输出
2 STDERR_FILENO 标准错误

Linux下可执行文件格式:ELF
file a.out

0-4k受保护的地址:不允许用户访问 (NULL位置)
ELF段 :
.text 代码段,二进制机器指令
.data已初始化全局变量
.bss未初始化全局变量
其他段:1.只读数据段
2.符号段等


堆空间
共享库
栈空间
命令行参数
环境变量

CPU为什么要使用虚拟地址空间和物理地址空间映射?

1.方便编译器和操作系统安排程序的地址分布。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区
2.方便进程之间隔离
不同进程使用不同的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进行使用的物理内存。
3.方便OS使用你那可怜的内存
程序可以使用以系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
内存管理器会将物理内存页(通常大小为4KB)保存到磁盘文件。数据或代码页会根据需要在物理内存和磁盘之间移动。

系统API
应用层:操作用户空间
系统调用:sys_write();
内核层:设备驱动函数

errno 记录系统的最后一次错误代码,代码值是一个int

定义在头文件errno.h中:全局变量 任何标准C库函数都能对其进行修改(Linux系统函数也可以)
错误宏第一位置:1-34个错误 /usr/include/asm-generic/errno-base.h
35-133 /usr/include/asm-generic/errno.h

perror 头文件 stdio.h
函数定义 void perror(const char *s)
函数说明:用来将上一个函数方式错误的原因输出到标准设备
参数S所指的字符串会先打印出

umask 掩码
文件权限:本地有一个掩码
文件的实际权限 :给定的权限 & !本地掩码

Linux Programmer‘s Manual
Perl Programmers Reference Guide

2017/04/22学习笔记