linux面试总结

文章目录

  • 一、常用快捷命令
  • 二、进程间的通信
    • 2.1、管道
    • 2.2、FIFO
    • 2.3、消息队列
    • 2.4、信号量
    • 2.5、共享内存
    • 2.6、套截字
  • 三、进程与线程的区别
  • 四、TCP协议和UDP协议的区别
  • 五、TCP协议的三次握手
  • 六、为什么是三次而不是两次
  • 七、TCP协议的四次挥手
  • 八、互斥锁
  • 九、死锁

一、常用快捷命令

  1. ls :显示当前文件的所有内容。
  2. cd :切换当前目录。
  3. pwd :显示当前工作路径。
  4. tree :显示文件和目录(由根目录开始的树形结构)。
  5. mkdir :创建目录。
  6. rm :删除文件。
  7. rmdir :删除目录。
  8. cp :复制文件/mul.
  9. touch :创建一个文件夹。
  10. find :文件寻找
  11. mount :挂载文件系统
  12. useradd :创建一个新用户
  13. cat :在命令行中显示文件的内容
  14. ps -aux :显示当前的进程
  15. history :显示敲过的指令
  16. echo $ PATH: 获得当前环境变量
  17. file :查看文件属性(x86/arm)
  18. chmod :修改文件权限
  19. top : 动态地监视进程活动与系统负载等信息
  20. free :查看内存和已经使用的内存

二、进程间的通信

2.1、管道

管道:通常指无名管道,是 UNIX 系统 IPC 最古老的形式。
特点:

  • 半双工(即数据只能在一个方向上流动),具有固定的写端和读端
  • 它只能用于具有亲缘关系的进程之间的(父子进程或兄弟进程之间)
  • 万物皆文件,可以被看成是一种特殊的文件,可以使用普通的读些 write,read等函数。但它不是普通文件,并不属于其他文件系统,只存于内存中。

原型:
#include
Int pipe(int fd[2]); //返回值,若成功返回 0,失败返回-1。
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开

#include 
#include 
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:也称为命名管道,它是一种文件类型
特点:

  1. FIFO 可以在无关的进程之间交换数据,与无名管道不同。
  2. FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

原型:
#include
//返回值:成功返回 0,出错返回-1。
int mkfifo (const char *pathname, mode_t mode ) ;

2.3、消息队列

消息队列:是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点:

  1. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
  2. 消息队列独立于发送与接收进程,进程终于时,消息队列及其内容并不会被删除。
  3. 消息队列可以实现消息的随即查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

2.4、信号量

信号量:用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:

  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
  2. 信号量基于擦做系统的 PV 操作,程序对信号量的操作都是原子操作。
  3. 每次信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
  4. 支持信号量组。

2.5、共享内存

共享内存:指的领个或多个进程共享一个给定的存储区
特点:

  1. 共享内存是最快的一种 IPC(进程间通信),因为进程是直接对内存进行存取。
  2. 因为多个进程可以同时操作,所以需要进行同步。
  3. 信号量+共享内存通常结合在一起操作,信号量用来同步对共享内存的访问。

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包服务端没有收到,可以再补发一个)

八、互斥锁

什么是互斥锁:当多个线程对一个资源进行访问的时候,我们需要对线程进行加锁处理,这样我们可以让线程按照顺序一个一个的访问而不是一拥而上。

九、死锁

死锁是什么:就是相当于一个循环,我拿着你家门钥匙,你拿着他家门钥匙,他拿着我家门钥匙,那么谁都不能回家,这就叫死锁。

你可能感兴趣的:(linux)