1 Vsftpd配置
vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字
local_max_rate = 0: 本地用户使用的最大传输速度,单位为B/s, 0表示不限制速度,预设值为0
anon_max_rate = 0:设置匿名登录者使用的最大传输速度,单位为B/s,0表示不限制速度,预设值为0
2 局部数组
具有局部作用域,当函数调用结束之后,数组被操作系统销毁,回收了内存空间,里面的内容被覆盖,虽然得到的指针是指向这块内存的,但是内容发生了改变,具有随机性。解决策略:1 返回一个静态数组 2 动态分配内存,可能会内存泄露 3 使用全局数组
3 引用和指针的区别
引用必须初始化,指针任何时候都可以初始化;引用后不能再引用其他对象,指针可以;引用不能为空,指针可以。指针必须初始化避免出现野指针是指针在使用之前必须初始化
4 迭代器 std::vector::iterator
迭代器的本质是指针,++,-- ,用于双向迭代;*引用迭代器对应的元素;==判断两个迭代器是否相等
5 变量的基本类型
每个变量都有内置类型(int/float)和存储类型:
自动变量auto:普通局部变量,默认的分配类型,存储在动态存储区;
静态变量static:静态全局和静态局部,存储在静态存储区;
静态局部变量的特点:
在全局数据区分配内存 ,局部变量申明为static,生存期延长,离开局部时,局部变量的值会保存,下次回到局部时,可以读取保存的值。全局变量声明为static后,作用域非但没有扩大,反而缩小,只能在所在的文件内使用。
局部变量可以使用static,形参不能
在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再初始化
一般在声明处初始化,没有显式初始化,自动初始化为0
始终驻留在全局数据区,直到程序运行结束,但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
外部变量extern:普通全局变量,函数外部定义,存在静态存储区;
以上都在内存中
寄存器变量register:直接储存在CPU寄存器中,方便快速访问,编译器可以自动将调用次数多的变量放入寄存器中
6 模板
可用来创建动态增长和减小的数据结构
类型无关,具有很高的复用性
在编译时而不是运行时检查数据类型,保证了类型安全
平台无关,可移植
可用于基本数据类型
使用:需要指定参数类型,形参名不可以同名
函数模板 template<class a1, class a2> 返回类型 函数名(参数列表){}
类模板 template<class a1, class a2> class 类名{};
7 fork()
fork 之后子进程复制了父进程的全部资源,虚拟地址空间的num地址的值相同,但是真实的物理地址不一样。
继承了真个进程的地址空间,包括: 进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设置,进程优先级
进程组号,当前工作目录,根目录,资源限制,控制终端等。
子进程和父进程的区别在于:
(1) 父进程设置的锁子进程不继承
(2)各自的进程ID和父进程ID不同
(3)子进程的未决告警被清除
(4)子进程的未决信号集设置为空集
clone() 函数是将部分父进程的资源的数据结构进行复制(clone_flages来决定哪些资源复制),带参数,没有复制的资源可以通过指针共享给子进程,返回子进程的pid
clone 是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间,有选择的继承父进程的内存
甚至可以将创建出来的进程变成父进程的兄弟进程
vfork() 是共享内存
8 虚函数
可以通过基类指针或引用访问基类和派生类中的虚函数,从而实现动态关联,基类指针指向哪个类的对象就调用哪个类的函数,如果不加virtual,就变成了静态关联
9 函数重载
不能把返回值(函数类型)作为函数重载的条件,因为编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会去验证返回类型,多以返回值不能作为函数重载的依据。
函数名称/参数个数/参数类型/const
如果同时在类中,对于函数名相同的const函数和非const函数能够构成重载:
定义的是常对象,调用的是const成员函数/定义非常对象,调用重载的非const成员函数。
10 printf()
“%.5s”字符串最多输出5个字符
“%5s”输出至少5个字符,如果不够5个字符,左侧用空格补齐
11 feof()
从输入流读取数据,如果到达文件尾(遇到文件结束符),eof函数值为非零值,否则为0
12 交换值
x+=y; y=x-y; x-=y;
13 声明和定义
声明:指定了一个变量的标识符,用来描述变量的类型,是类型,对象还是函数
定义:对声明的实现或者实例化,连接器需要定义来引用内存实体
14 数组指针和指针数组
p和[]结合就是数组,和*结合就是指针; [],()优先级都大于*
char *p[10], p与[]结合,是数组,数组的元素是指针,指针的大小32位机是4,4*10 = 40
char(*p)[10], p与*结合是指针,大小为 4
二维数组
定义二维数组,若第一维不确定第二维确定,则数组必须初始化
初始化后的数组中的元素个数除以第二维的大小加上1 得到第一维的大小
若两维全部确定,不用初始化,默认元素全部为0
不允许第二维不确定
15 数据结构
逻辑结构分为线性和非线性:
线性:线性表,栈,队列,双队列,数组,串
非线性:二维数组,多维数组,广义表,树,图
数组,一块连续内存,访问O(1),随机插入和删除费事
链表,非连续空间,指针访问,随机插入和删除方便,查询费事; 循环链表,只有头节点是固定的,线性表头指针和尾指针无法决定链表长度:因为插入和删除是任意的,没有空间限制
栈,在栈顶操作,插入删除费事, 长度由栈顶决定
队列,队头队尾操作,插入删除费事,直接在队尾添加方便 ; 循环队列队头和队尾指针变化决定长度
哈希表,键值对操作,知道相关的key就可以读取插入和删除
16 hosts 文件
hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件,以ascii格式保存在/etc/目录下
包含了ip地址与主机名之间的映射,还包括主机的别名,在没有域名解析服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用dns服务程序来解决,将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问
17 死锁
互斥条件/请求和保持/不可剥夺,这3个条件可能发生死锁,但不一定会发生死锁,加上循环等待才一定会发生死锁
18 结构体
typedef struct A{ int n; char ch[8] }B;
结构体类型(名) struct A 或 B;因为用typedef 定义为相同类型
定义变量: 结构体类型名 + 结构体变量 struct A name 或 B name;
19 编译
把源程序编译成目标程序经过5个阶段:词法分析,语法分析,语义检查和中间代码生成,代码优化,目标代码生成
按照编译的工作内容推断编译错误分为词法错误和语法错误
20 #define 和typedef
typedef 定义了一个新的类型别名,有类型检查,在编译的时候处理, 定义多变量没有问题
#define 简单替换,无类型检查,在预编译的时候处理,定义多变量就近结合原则