文章目录
一、常用快捷命令
- ls :显示当前文件的所有内容。
- cd :切换当前目录。
- pwd :显示当前工作路径。
- tree :显示文件和目录(由根目录开始的树形结构)。
- mkdir :创建目录。
- rm :删除文件。
- rmdir :删除目录。
- cp :复制文件/mul.
- touch :创建一个文件夹。
- find :文件寻找
- mount :挂载文件系统
- useradd :创建一个新用户
- cat :在命令行中显示文件的内容
- ps -aux :显示当前的进程
- history :显示敲过的指令
- echo $ PATH: 获得当前环境变量
- file :查看文件属性(x86/arm)
- chmod :修改文件权限
- top : 动态地监视进程活动与系统负载等信息
- free :查看内存和已经使用的内存
二、进程间的通信
2.1、管道
管道:通常指无名管道,是 UNIX 系统 IPC 最古老的形式。
特点:
- 半双工(即数据只能在一个方向上流动),具有固定的写端和读端
- 它只能用于具有亲缘关系的进程之间的(父子进程或兄弟进程之间)
- 万物皆文件,可以被看成是一种特殊的文件,可以使用普通的读些 write,read等函数。但它不是普通文件,并不属于其他文件系统,只存于内存中。
原型:
#include <unistd.h>
Int pipe(int fd[2]); //返回值,若成功返回 0,失败返回-1。
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd[2]; //两个文件秒速符
pid_t pid; //获取进程编号
char buf[20];
if(pipe(fd) < 0) //创建管道
{
printf("create pipe error\n");
}
if((pid = fork()) < 0) //创建子进程
{
printf("fork error\n");
}
else if(pid > 0)
{
close(fd[0]); //关闭读端
write(fd[1],"hello world\n",12);
}
else
{
close(fd[1]); //关闭写端
read(fd[0],buf,20);
printf("%s",buf);
}
return 0;
}
2.2、FIFO
FIFIO:也称为命名管道,它是一种文件类型
特点:
- FIFO 可以在无关的进程之间交换数据,与无名管道不同。
- FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
原型:
#include <sys/stat.h>
//返回值:成功返回 0,出错返回-1。
int mkfifo (const char *pathname, mode_t mode ) ;
2.3、消息队列
消息队列:是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点:
- 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
- 消息队列独立于发送与接收进程,进程终于时,消息队列及其内容并不会被删除。
- 消息队列可以实现消息的随即查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
2.4、信号量
信号量:用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:
- 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
- 信号量基于擦做系统的 PV 操作,程序对信号量的操作都是原子操作。
- 每次信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
- 支持信号量组。
2.5、共享内存
共享内存:指的领个或多个进程共享一个给定的存储区
特点:
- 共享内存是最快的一种 IPC(进程间通信),因为进程是直接对内存进行存取。
- 因为多个进程可以同时操作,所以需要进行同步。
- 信号量+共享内存通常结合在一起操作,信号量用来同步对共享内存的访问。
2.6、套截字
套截字:可以用于不同机器间的通信。
三、进程与线程的区别
进程:就是一个内存中的运用程序,一个程序只能有一个进程。进程在内存中有自己的空间,一个进程至少有一个线程。(进程就是资源分配的最小单位)
线程:进程中的一个执行单元(是程序执行的最小单位)
四、TCP协议和UDP协议的区别
1.TCP协议传输的时候需要建立连接(通过三次握手来建立)。
UPD不需要建立连接。
2.TCP的协议更加准确(有序,无差错)。
UDP的协议可能会有丢失。
3.TCP面向字节流,能把信息分组。
UDDP面向数据,不能把信息分组。
五、TCP协议的三次握手
第一次握手:客户端向服务端发起请求,并发送一个SYN包。
第二次握手:服务端收到客户端的请求,回复刚才的SYN包,并附加一个ask包。
第三次握手:客户端回复服务端这个ask包,确认正确。
重点:
TCP协议是全双工的,所以客户端或者服务端都能发起请求。
六、为什么是三次而不是两次
为了解决网络通信不安全的问题。
原因:
在第一次握手的时候,客户端发送了一个SYN包,但是由于一些原因。这个SYN包没有到达服务端,而在中途停留。客户端就会又发起一个SYN_1包,然后按照三次握手的原则完成连接,这个时候SYN包到了服务端,依旧按照三次握手完成了连接。这个时候的客户端是只有一个连接SYN_1的。而服务端是两个连接SYN和SYN_1的。所以为了保证准确,我们需要三次挥手。
七、TCP协议的四次挥手
第一次挥手:客户端向服务端说我这边没有需求了,并发送了一个FIN包
第二次挥手:服务端向客户端回复好的,并发送了一个ACK包(客户端还可以接受信息)
第三次挥手:服务端向客户端发送消息,我这边没有数据了可以关闭,并发送一个FIN包
第四次挥手:客户端向服务端回复好,并回复一个ACK包(客户端进入一个超时等待状态,防止发送的第四次挥手发送ACK包服务端没有收到,可以再补发一个)
八、互斥锁
什么是互斥锁:当多个线程对一个资源进行访问的时候,我们需要对线程进行加锁处理,这样我们可以让线程按照顺序一个一个的访问而不是一拥而上。
九、死锁
死锁是什么:就是相当于一个循环,我拿着你家门钥匙,你拿着他家门钥匙,他拿着我家门钥匙,那么谁都不能回家,这就叫死锁。