2017/04/22学习笔记

makefile中的函数

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

src=$(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

时间: 2024-12-19 13:08:04

2017/04/22学习笔记的相关文章

2017/04/27学习笔记

fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数执行另一个程序.当进程调用一个exec函数时,该进程的用户空间和数据完全被新程序替换,从新程序的启动例程开始执行.调用exec并不创建新进程,所以调用exec前后该进程ID不变.将当前进程的.text .data替换为所要加载程序的.text .data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳. int execl();int execlp();int

2017/04/29学习笔记

信号的概念 信号在我们的生活中随处可见,如:古代战争中摔杯为号:现在战争中的信号弹:体育比赛中使用的信号枪...他们都有共性: 1.简单 2.不能携带大量的信息 3.满足某个特设条件才发送.信号是信息的载体,Linux/Unix 环境下,古老 .经典的通信方式,现在依然是主要的通信手段.Unix早期版本就提供了信号机制,但不可靠,信号可能丢失.Berkeley和AT&T都对信号模型做了修改,增加了可靠信号机制.但彼此不兼容.POSIX.1对可靠信号例程进行了标准化. 信号的机制 A给B发生信号,

2017/04/20学习笔记

man man 查看帮助文档echo $PATHreboot 重启poweroff 关机 vim --vimvim是从vi发展过来的一款文本编辑器vim的三种工作模式命令模式--打开vim之后,默认模式编辑模式--需要输液一些命令,切换到编辑模式末行模式--在末行模式下可以输入一些命令 :号 aiosAIOS w保存光标移动HJKL行首:0行尾:$文件开始:gg结束:G行跳转: 300G x:删除光标所在字符u: 撤销X:删除光标前字符dw:删除单词d0:删除光标前d$:删除光标后 Ddd:删除

2017/04/05学习笔记

栈的应用 案例1:就近匹配几乎所有的编译器都具有检测括号是否匹配的能力如何实现编译器中的符号成对检测?#include <stdio.h> int main(){int a[4][4];int (*p)[4];p =a[0];return ;算法思路从第一个字符开始扫描当遇见普通字符时忽略当遇见左符号时压入栈中当遇见右符号时从栈中弹出栈顶符号,并进行匹配匹配成功:继续读入下一个字符匹配失败:立即停止,并报错结束:成功:所以字符扫描完毕,且栈为空失败:匹配失败或所有字符扫描完毕但栈非空当需要继承

2017/02/22学习笔记

strlen()返回size_tsize_t是 unsigned int类型很多函数,如果确认不会返回小于0的值,那么就会使用size_t类型 size_t 和int兼容 字符串比较不能使用==比较 需要使用strcmp比较 strcmp相等返回0 否则返回非0(1,-1):如果第一个参数的ASCII小于第二个参数,那么函数返回-1,如果相等返回0,否则返回1 #include 和 #define#include就是简单的文件内容替换#define 就是简单的文本替换 //头文件语法格式//如果

2017/04/23学习笔记

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <dirent.h> int getFileNum(char* root){ //open dir DIR* dir = NULL; dir = opendir(root); if(dir == NULL){ perror("opendir"); exit(1); } //遍历 struct dir

2017.04 vue学习笔记---08表单控件绑定---基础用绑定value

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> div{ margin-bottom: 30px; } </style> <script src="js/vue.js"></script> <

2017.04 vue学习笔记---08表单控件绑定---基础用法

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> div{ margin-bottom: 30px; } </style> <script src="js/vue.js"></script> <

2017.2.28学习笔记------------uboot 与linux内核的打补丁,编译,烧写

三者ping通是为了可以传文件. 第0课第5节_刚接触开发板之u-boot打补丁编译使用及建sourceinsight工程: Uboot打补丁:uboot源码是不能在2440用的,打了补丁后可以在2440中使用(在虚拟机里面配置,具体用到ls,cd,tar xjf u-boot-1.1.6等指令),解压出来等等,忘了可以看视频. Source insight工程:操作软件,方便看uboot源码等等,没什么可说的. 编译:cd u-boot-1.1.6 make 100ask_24x0.confi