1. Linux常用基本命令
文件管理
命令 |
功能 |
touch |
创建文件 |
mkdir |
创建目录 |
rm |
删除文件 / 目录 |
vim |
文件编辑 |
cat |
文件查看 |
cp |
复制 |
mv |
移动 |
file |
查看文件类型 |
wc |
文件容量 |
pwd |
当前位置 |
cd |
切换到指定目录下 |
ls |
显示指定目录下的内容 |
用户管理
命令 |
功能 |
id |
查当前id |
su |
切换当前用户 |
usermod |
修改用户信息 |
passwd |
设置密码 |
/etc/passwd 用户文件位置
/etc/group 用户组文件位置
/etc/shadow 认证信息文件位置
进程管理
命令 |
功能 |
ps |
查看进程 |
pgrep |
指定显示 |
top |
动态查看 |
nice |
更改优先级 |
renice |
更改优先级状态 |
Ctrl+z |
当前进程打入后台 |
jobs |
查看后台进程 |
bg |
调到前台(不占用shell) |
fg |
调到前台 |
kill |
关闭进程 |
systemctl start sshd |
开启sshd服务 |
w -i |
显示谁登陆过last |
软件仓库搭建
- 下载安装包,hostnamectl 查看系统版本
- 创建目录,mount 挂载镜像
- cd /etc/yum.repos.d/ 下建文件,名以repo结尾,两个仓库AppStream和BaseOS
- dnf install gcc 安装
dnf list 列出软件信息
dnf install 安装软件
yumdownloader httpd -destdir=/mnt 下载仓库中的安装包到目录
远程登陆服务器
shh -l root 192.168.0.10 连接
文件传输
上传 scp 文件名 root @ 192.168.0.10:/root/路径
下载 scp root @ 192.168.0.10:/root/路径
有的不复制,没有的复制 rsync -lr
打包: tar cf 文件
压缩: zip / gzip / bzip / xz
解压: unzip / gunzip
直接打包: tar zcf / tar zxf
定时任务/延迟任务
命令 |
功能 |
at 01:52 |
设定延时任务 |
at -c 1 |
查看任务 |
at -r 1 |
取消任务 |
mail |
查看输出 |
白名单: /etc/at.allow
黑名单: /etc/at.deny
crontab -e 定时任务(crond服务) 秒 分 时 天 月 周
系统级任务: 进目录 cd /etc/cron.d 写文件
2. C++基础知识
面向对象的四大特征
- 抽象:抽出具体事物的普遍特性;
- 封装:把数据和处理都包在一起;
- 继承:可以给别的函数使用;
- 多态:同一个函数的多种形态。
C++和C语言有什么不同
序号 |
方向 |
C |
C++ |
1 |
面向 |
面向过程——解决问题 |
面向对象——找谁解决 |
2 |
头文件 |
#include<stdio.h> |
#include<iostream> |
3 |
函数重载 |
函数名不允许相同 |
函数名相同但其他参数不同,则两个函数不同 |
4 |
命名空间 |
无此概念 |
using namespace std; |
5 |
输入输出 |
需要写变量类型 |
cin/cout 不用写变量类型,可以自动识别 |
6 |
动态内存 |
malloc / free |
new / delete |
new/delete 和 malloc/free 的区别
- 属性:new是关键字,需要编译器支持;malloc是库函数,需要头文件支持;
- 参数:new申请内存时不用指定内存块的大小,编译器会根据类型计算;
- 返回类型:new返回对象类型指针;malloc返回void*,需要强制转换;
- 分配失败:new会抛出bas_alloc异常;malloc分配失败会返回NULL;
- 内存区域:new会在自由存储区申请内存;malloc会在堆上申请内存。
类与结构体的区别
序号 |
方向 |
结构体 |
类 |
1 |
存储位置 |
栈存储 |
堆存储 |
2 |
公有私有 |
默认public |
默认private |
3 |
保护声明 |
不能声明protected |
可以声明protected |
4 |
构造函数 |
不能声明默认的构造函数 |
不限制声明构造函数 |
5 |
类型不同 |
值类型 |
引用类型 |
当函数参数或局部变量与成员变量重名时,就必须用 this
构造函数和析构函数
构造函数的特点:
- 创建对象时调用 ;
- new可调用;
- 必须与类同名;
- 没有返回值;
- 可以有多个构造函数。
默认构造函数:如果没有创建构造函数就会有一个隐藏的不带参数的构造函数。
作用:
- 建立标识;
- 开辟内存空间;
- 完成成员初始化。
析构函数的特点:
- 离开作用域时调用;
- delete可调用;
- 与类同名并加 ~ ;
- 没有参数;
- 没有返回值;
- 只能有一个析构函数。
拷贝构造函数和赋值运算符重载
拷贝构造函数:防止二次释放
- 类之间直接复制;
- 函数值传递;
- 作为返回值传递。
赋值运算符重载:
stack s;
stack t;
t = s;
指针和引用的区别
序号 |
指针 |
引用 |
1 |
指向一块内存,内容是地址 |
某块内存的别名 |
2 |
定义后还可以变 |
只能在定义时初始化(必须初始化) |
3 |
需要解引用 |
不需要解引用 |
4 |
sizeof指针是指针大小 |
sizeof引用是对应类型大小 |
几种关键字
友元声明friend: 其他类或外部函数要访问类中私有成员
特点:单向性;不可传递性。
const限定符:
变量:只读,不可修改;定义时必须初始化;
#define宏定义:预处理时替换,没有类型,不分配内存。const相反。
指针:指针常量,不可修改地址;
引用:别名;
函数:非const类型参数不接受const变量;
类:const成员变量,要初始化;const成员函数,表示不修改成员变量
static限定符:
变量:静态变量,改变作用域和生存周期;
函数:只源文件内部使用的函数;
成员变量:对象共享变量;
成员函数:类提供的函数,静态成员对象的接口。
内联函数inline:如同整个函数体替换在主函数中
- inline是放在函数体前才能声明为内联函数;
- 类中成员函数默认为内敛函数;
- 编译器会决定是否为内联函数。
继承顺序和构造顺序
继承顺序:
构造顺序:
虚函数
虚函数: 父子类有相同函数;如果调用父类那就调用父类自己的函数;如果调用子类,看子类有没有virtual,没有调用父类中的函数,有则调用子类中的函数。
本质:虚函数表
纯虚函数:定义抽象表virtual int GetLength() const = 0;
重载和覆盖的区别
序号 |
重载 |
覆盖 |
1 |
函数名相同,但其他参数有不同 |
函数名和所有的参数都相同 |
2 |
同一个类中不同成员函数之间的关系 |
父类与子类中不同成员函数的关系 |
3 |
根据参考列表决定 |
根据对象类型决定 |
4 |
在编译时确定调用 |
在执行时确定调用 |
定义和声明的区别
定义:变量分配存储空间,为变量指定初始值。只有一个定义;
声明:向程序表明变量的类型和名字。
内存的存储内容
内存泄漏和内存溢出的区别
内存泄漏: 在动态申请内存空间时,对指针申请了空间,但使用完后未进行释放,指针变为野指针,形成内存泄漏。
内存溢出: 内存泄漏的堆积会导致内存溢出,内存溢出是你要的内存空间超过系统给分配的空间。
vector的内存增长问题
vector的内存增长问题,其中 size() 和 capacity() 问题,vector的内存分配是按照2的倍数分配内存的。当前容量对插入元素不够时,分配一块新的内存(2倍),然后复制旧内存,释放旧内存,会多次涉及拷贝构造函数和析构函数。
3. Linux系统编程
进程和线程的区别
序号 |
方向 |
进程 |
线程 |
1 |
定义 |
程序的执行过程 |
执行的每一个任务 |
2 |
包含 |
包含多个线程 |
只属于一个线程(本身) |
3 |
地址 |
有自己的地址空间 |
没有地址空间,他包含在进程的地址空间中 |
4 |
资源 |
消耗更多的计算机资源 |
开销代价更小 |
5 |
共享 |
不同进程间数据很难共享 |
同一进程下不同线程数据容易共享 |
进程
fork() 父子进程:父进程返回值是子进程的pid;子进程返回值是0。
特点:
- 并发进行:两进程同时跑,互不干扰;
- 相同但独立的地址空间:系统会把虚拟内存拷贝一份出来,两进程名自有堆和栈;
- 加static地址会短,静态变量在数据区,地址较小。
休眠:sleep(1)
僵尸进程:子进程退出,父进程未获得子进程状态信息;在父进程调用wait;有害
孤儿进程:父进程先于子进程退出;init进程为新父进程;无害
线程
比进程更小的独立运行的基本单位,是并发的;
线程标识: pthread_self()
创建: pthread_creat(id,NULL,函数,函参)
线程共用全局变量也共用局部变量
使用线程合并:pthread_join(id,返值) 主进程等待子进程跑完
锁
信号量: 让父进程和子进程有序打印
sem_wait(&sem) 上锁
sem_post(&sem) 解锁
互斥量:
pthread_mutex 定义互斥量
pthread_mutex_lock(&互斥量) 加锁
pthread_mutex_unlock(&互斥量) 解锁
信号量 |
互斥量 |
对象:线程和进程 |
对象:线程 |
可由不同线程完成 |
加解锁由同一线程使用 |
用于线程同步 |
用于线程互斥 |
条件变量: 完成条件后再执行线程
pthread_cond_t 条件变量 = PTHREAD_COND_INITIALIZER;
条件等待:pthread_cond_wait(&条件变量,&互斥量)
单个激活:pthread_cond_signal(&条件变量)
读写锁: 读取过程共同读,提高工作效率
读锁:读过程中其他读也可以进行读操作
写锁:写过程中不能进行其他操作
HTTP网络编程
HTTP是应用层上的协议,HTTP是基于TCP/IP通信协议来传递数据,可以使用建立socket的方式来监听某一端口(8080端口),来实验这个web服务器。基于socket来实现客户端和服务器的交流。
HTTP协议是超文本传输协议,通过http请求可以访问服务器上的HTML文件、图片等。
请求报文: 客 => 服
GET是客户端把密码或检索信息发给服务器,发给URL
响应报文: 服 => 客
注意:文本格式去掉,可响应各种类型的文件
状态码:
状态码 |
对应英文 |
意义 |
200 |
OK |
请求成功 |
301 |
Moved Permanently |
资源被永久转移到其他URL |
404 |
Not Found |
请求资源不存在 |
500 |
Internal Server Error |
服务器内部错误,无法完成请求 |
HTTP服务器
- 启动服务器;
- 启动客户端(网页)输入 http://127.0.0.1:8080,发送请求报文给服务器,服务器端收到报文;
- 服务器端向服务器发送响应报文,客户端(网页)信息栏可以看到报文首部信息,页面上可以看到报文主题。