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,发送请求报文给服务器,服务器端收到报文;
- 服务器端向服务器发送响应报文,客户端(网页)信息栏可以看到报文首部信息,页面上可以看到报文主题。
|