面试问题整理(不断更新)

该博客聚焦于面试相关的信息技术知识。涵盖C++的面向对象特性、多态实现、内存分区等内容,还介绍了计算机网络的OSI七层与四层模型、TCP与UDP区别、HTTPS与HTTP区别等,同时涉及操作系统的锁机制、Linux的同步与进程间通信方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++:

1、面向对象三大特性,并且具体举例说明
封装、继承和多态。

封装:
定义:数据和代码捆绑在⼀起,避免外界⼲扰和不确定性访问。
功能:把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让可信的类或者对象操作,对不可信的进⾏信息隐藏,例如:将公共的数据或⽅法使⽤public修饰,⽽不希望被访问的数据或⽅法采⽤private修饰。

继承:
定义:让某种类型对象获得另⼀个类型对象的属性和⽅法。
功能:它可以使⽤现有类的所有功能,并在⽆需重新编写原来的类的情况下对这些功能进⾏扩展。
常⻅的继承有三种⽅式:
1、实现继承:指使⽤基类的属性和⽅法⽽⽆需额外编码的能⼒
2、接⼝继承:指仅使⽤属性和⽅法的名称、但是⼦类必须提供实现的能⼒
3、可视继承:指⼦窗体(类)使⽤基窗体(类)的外观和实现代码的能⼒
例如:
将⼈定义为⼀个抽象类,拥有姓名、性别、年龄等公共属性,吃饭、睡觉等公共⽅法,在定义⼀个具体的⼈时,就可以继承这个抽象类,既保留了公共属性和⽅法,也可以在此基础上扩展跳舞、唱歌等特有⽅法。

多态:
定义:
同⼀事物表现出不同事物的能⼒,即向不同对象发送同⼀消息,不同的对象在接收时会产⽣不同的⾏为(重载实现编译时多态,虚函数实现运⾏时多态)。
功能:
多态性是允许你将⽗对象设置成为和⼀个或更多的他的⼦对象相等的技术,赋值之后,⽗对象就可以根据当前赋值给它的⼦对象的特性以不同的⽅式运作。
简单⼀句话:允许将⼦类类型的指针赋值给⽗类类型的指针。
例如:
基类是⼀个抽象对象–⼈,那学⽣、运动员也是⼈,⽽使⽤这个抽象对象既可以表示学⽣、也可以表示运动员。

2、多态如何实现
实现多态有两种⽅式:

  1. 覆盖(override): 是指⼦类重新定义⽗类的虚函数的做法。
  2. 重载(overload): 是指允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

3、堆和栈的区别
在C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区、常量存储区

栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。
堆:是由new分配的内存块,由程序员释放(编译器不需要操作),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。
自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分)。
常量存储区:这是一块特殊存储区,里边存放常量,不允许修改。

堆和栈的区别:
在这里插入图片描述
4、 什么是对齐,以及为什么要对齐:
4.1 概念
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

4.2 对齐的作用及原因:
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。

4.3 对齐的原则
有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始址%N=0"。
数据结构中的数据变量都是按照定义的顺序来排放的,第⼀个数据变量的起始地址就是数据结构的起始地址。
结构体本身也要根据⾃身的有效对齐值取整(结构体成员变量占用总长度,要满足是结构体有效对齐值的整数倍)
总结:
各变量要对齐 + 结构体整体也要对齐。

5、指针和引用的区别

  1. 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名。
  2. 指针可以有多级,引用只有一级。
  3. 指针可以为空,引用不能为NULL且在定义时必须初始化。
  4. 指针在初始化后可以改变指向,而引用在初始化之后不可再改变。
  5. sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小。
  6. 当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以。
  7. 引用本质是一个指针,同样会占4字节内存;指针是具体变量,需要占用存储空间(具体情况还要具体分析)。
  8. 引用在声明时必须初始化为另一变量,一旦出现必须为typename refname &varname形式;指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体变量。
  9. 引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。

6、C++中struct和class的区别
相同点:

  1. 两者都拥有成员函数、公有和私有部分
  2. 任何可以使用class完成的工作,同样可以使用struct完成

不同点:

  1. 两者中如果不对成员不指定公有私有,struct默认是公有的,class则默认是私有的
  2. class默认是private继承, 而struct默认是public继承

引申:C++和C的struct区别

  1. C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)。
  2. C中struct是没有权限的设置的,且struct中只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数
  3. C++中,struct增加了访问权限,且可以和类一样有成员函数,成员默认访问说明符为public(为了与C兼容)
  4. struct作为类的一种特例是用来自定义数据结构的。一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构体类型名使用,此外结构体struct在C++中被当作类的一种特例。

7、C++中const和static的作用
static
不考虑类的情况

  1. 隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用
  2. 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区
  3. 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用

考虑类的情况

  1. static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。
  2. static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问.

const
不考虑类的情况

  1. const常量在定义时必须初始化,之后无法更改。
  2. const形参可以接收const和非const类型的实参,例如// i 可以是 int 型或者 const int 型void fun(const int& i){ //…}。

考虑类的情况

  1. const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化。
  2. const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以在const成员函数中被修改)数据的值。
    补充一点const相关:const修饰变量是也与static有一样的隐藏作用。只能在该文件中使用,其他文件不可以引用声明使用。 因此在头文件中声明const变量是没问题的,因为即使被多个文件包含,链接性都是内部的,不会出现符号冲突。

8、C++有哪几种的构造函数
C++中的构造函数可以分为4类:

  1. 默认构造函数
  2. 初始化构造函数(有参数)
  3. 拷贝构造函数
  4. 移动构造函数(move和右值引用)
  5. 委托构造函数(在c++11中有一个新特性,就是委托构造函数。委托构造函数可以使用当前类的其他构造函数来帮助当前构造函数初始化。换而言之,就是可以将当前构造函数的部分(或者全部)职责交给本类的另一个构造函数。)
  6. 转换构造函数

默认构造函数和初始化构造函数在定义类的对象,完成对象的初始化工作
复制构造函数用于复制本类的对象
转换构造函数用于将其他类型的变量,隐式转换为本类对象

9、浅拷贝和深拷贝的区别
浅拷贝
浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误。

深拷贝
深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被析构掉,释放内存了也不会影响到深拷贝得到的值。在自己实现拷贝赋值的时候,如果有指针变量的话是需要自己实现深拷贝的。

10、智能指针
解决问题:C++中没有垃圾回收机制,必须自己释放内存,否则就会造成内存泄漏。因此采用智能指针(smart pointer)来解决该问题。智能指针是一个存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁分配的对象,防止内存泄露。该技术的核心在于引用计数,每使用它一次,内部引用技术加1,每析构一次内部的引用计数减1,减到0时,删除所指向的堆内存。

C++11中引入了三种智能指针,使用时需要包含#include <memory> 头文件。

  • std::shared_ptr:共享的智能指针。可以由多个指针去管理一个内存,每增加一个引用计数器加1,减少一个引用计数器减1.当计数器减为0时需要删除该指针所指向的堆内存。
  • std:unique_ptr:独占的智能指针。只有一个指针指示,如果需要新的指针指示需要move操作。
  • std:weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视shared_ptr的。

关于智能指针的详细理解,可以参考这篇博客:添加链接描述

11、C++中static关键字
静态数据成员
  在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
  使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
  静态数据成员的使用方法和注意事项如下:
  1、静态数据成员在定义或说明时前面加关键字static。
  2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
    <数据类型><类名>::<静态数据成员名>=<值>
  这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
   (2) 初始化时不加该成员的访问权限控制符private,public等。
   (3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
  3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
  4、引用静态数据成员时,采用如下格式:
   <类名>::<静态成员名>
  如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。

静态成员函数
  静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
  在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。

12、C++中const关键字
const的作⽤:
被它修饰的值不能改变,是只读变量。必须在定义的时候就给它赋初值。
1、常量指针(底层const )
常量指针:
是指定义了⼀个指针,这个指针指向⼀个只读的对象,不能通过常量指针来改变这个对象的值。常量指针强调的是指针对其所指对象的不可改变性。
靠近变量名。
形式:
(1)const 数据类型 *指针变量 = 变量名
(2)数据类型 const *指针变量 = 变量名

int temp = 10;
const int* a = &temp;
int const *a = &temp;
// 更改:
*a = 9; // 错误:只读对象
temp = 9; // 正确

2、指针常量(顶层const)
指针常量:
指针常量是指定义了⼀个指针,这个指针的值只能在定义时初始化,其他地⽅不能改变。指针常量强调的是指针的不可改变性。
特点:
靠近变量类型。
形式:
数据类型 * const 指针变量=变量名

int temp = 10;
int temp1 = 12;
int* const p = &temp;
// 更改
p = &temp2; // 错误
*p = 9; // 正确

13、简要说明C++的内存分区
在这里插入图片描述
14、C++得内存管理
在这里插入图片描述

15、全局变量和局部变量有什么区别
在这里插入图片描述

16、定义和声明的区别
在这里插入图片描述
17、全局变量和static变量的区别
在这里插入图片描述
18、将引用作为函数参数有哪些好处
在这里插入图片描述

计算机网络:

1、OSI七层模型和四层模型,四层模型每一层的具体功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、TCP与UDP的区别

  1. 连接
    TCP是⾯向连接的,在传输前需要三次握⼿建⽴连接,UDP不需要连接,即刻传输数据。
  2. 服务形式
    TCP只能⼀对⼀,点对点服务,UDP⽀持⼀对⼀、⼀对多、多对多通信。
  3. 可靠性
    TCP保证数据可靠交付,拥有确认应答和重传机制,⽆重复、不丢失、按序到达;UDP尽可能交付,不保证可靠性。
  4. 连接控制机制
    TCP拥有流量控制、拥塞控制,保证传输安全性等,UDP在⽹络拥堵情况下不会降低发送速率。
  5. ⾸部⼤⼩
    TCP⾸部⻓度不适⽤选项字段是20字节,使⽤选项字段⻓度增加(可变),UDP⾸部固定8字节。
  6. 传输⽅式
    TCP基于字节流,没有边界,但是保证传输顺序和可靠性;UDP继承了IP层特性,基于数据包,有边界可能出现乱序和丢包。
  7. 分⽚⽅式
    TCP数据⼤于MSS时会在TCP层将数据进⾏分⽚传输,到达⽬的地后同样在传输层进⾏合并,如果有某个⽚丢失则只需要重传丢失的分⽚即可;UDP数据⼤于MTU时会在IP层分⽚,同样也在⽬的IP层合并,如果某个IP分⽚丢失,则需要将所有分⽚都进⾏重传,开销⼤。

3、TCP如何保证安全传输
TCP通过三次握手、四次挥手,而且TCP有流量控制和拥塞控制机制,通过这些来保证数据的安全传输。

4、HTTPS和HTTP的区别
1、HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

2、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

5、什么是SSL/TLS
SSL代表安全套接字层。它是一种用于加密和验证应用程序(如浏览器)和Web服务器之间发送的数据的协议。 身份验证,加密HTTPS的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

SSL/TLS协议作用:认证用户和服务,加密数据,维护数据的完整性的应用层协议加密和解密需要两个不同的密钥,故被称为非对称加密;加密和解密都使用同一个密钥的

对称加密:优点在于加密、解密效率通常比较高 ,HTTPS 是基于非对称加密的, 公钥是公开的。

操作系统:
1、介绍一下几种典型的锁
读写锁

  • 多个读者可以同时进行读。
  • 写者必须互斥(只允许一个写者写,也不能读者写者同时进行)。
  • 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

互斥锁
一次只能一个线程拥有互斥锁,其他线程只有等待。
互斥锁是在抢锁失败的情况下主动放弃CPU进入睡眠状态直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时唤醒阻塞的线程或者进程,需要把锁交给操作系统管理,所以互斥锁在加锁操作时涉及上下文的切换。互斥锁实际的效率还是可以让人接受的,加锁的时间大概100ns左右,而实际上互斥锁的一种可能的实现是先自旋一段时间,当自旋的时间超过阀值之后再将线程投入睡眠中,因此在并发运算中使用互斥锁(每次占用锁的时间很短)的效果可能不亚于使用自旋锁。

条件变量
互斥锁一个明显的缺点是他只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用,以免出现竞态条件。当条件不满足时,线程往往解开相应的互斥锁并阻塞线程然后等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。总的来说互斥锁是线程间互斥的机制,条件变量则是同步机制。

自旋锁
如果进线程无法取得锁,进线程不会立刻放弃CPU时间片,而是一直循环尝试获取锁,直到获取为止。如果别的线程长时期占有锁,那么自旋就是在浪费CPU做无用功,但是自旋锁一般应用于加锁时间很短的场景,这个时候效率比较高。

关于锁的具体介绍,可以参见这篇博客:添加链接描述

Linux:
1、Linux下同步机制
POSIX信号量:可用于进程同步,也可用于线程同步。
POSIX互斥锁 + 条件变量:只能用于线程同步。

2、Linux下进程间通信方式
进程间的通信方式有六种:管道、消息队列、共享内存、信号量、信号、套接字socket。
方式1:管道
1.匿名管道(内存文件):

  • 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。
  • 进程的亲缘关系通常是指父子进程关系,例如,采用fork函数创建的父子进程。
  • 匿名管道作为特殊的文件,只存在于内存,不存在文件系统中。
  1. 有名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式。创建有名管道的方法:mkfifo函数。
    注意:
    管道其实本质是内核中的一个缓冲区,因此数据本质是通过内核在管道中流动。
    管道的缺点:管道之间的通信效率较低,不适合在进程之间频繁地交换数据。
    生命周期:随进程的创建而建立,随进程的结束而销毁。

方式2:消息队列
管道的通信方式缺点在于通信效率较低,不适合在进程之间频繁地交换数据。消息队列的通信模式在于,A进程要给B进程发送消息,A进程把数据放在对应的消息队列,B进程需要的时候去消息队列读取数据就可以了。同理B进程要给A进程发送消息也是一样的。

==消息队列是保存在内核中的消息链表。==在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的数据块,不像管道是无格式的字节流数据块。

生命周期:随内核,如果没有释放消息队列或没有关闭操作系统,消息队列会一直存在。

优点:
相比于管道通信方式,进程之间可以频繁的交换数据。
缺点:

  • 通信不及时。因为消息体是存储在对应的消息队列,从而有一定的延迟。
  • 附件的大小也有限制。不适合较大数据的传输,例如消息的最大长度(MSGMAX)和队列的最大长度(MAXMNB)。
  • 消息队列通信过程中,存在用户态和内核态之间的数据拷贝开销。

方式3:共享内存
实现思想:现代操作系统的内存管理,采用的是虚拟内存方式,每个内存都有独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存。==而共享内存的机制,就是将虚拟的地址空间映射到相同的物理内存中。

优点:
避免了消息队列中存在的内核态和用户态的拷贝开销问题。
缺点:
进程之间对于同一块物理内存操作时,存在的同步和异步问题。

方式4:信号量
解决问题:解决多进程竞争共享资源,导致的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。信号量就实现了这一保护机制。信号量本质是一个整形的计数器,主要用于实现进程间的互斥和同步,而不是用于缓存进程之间通信的数据。

实现方法:信号量表示资源的数量,控制信号量的方式有两种原子操作:

  1. 一个是P操作,该操作会将信号量减1,相减完如果信号量<0,**表示==资源已经被占用,进程需要阻塞等待。相减后如果**信号量>=0==,则表明还有资源可用,进程可以正常执行。
  2. 一个是V操作,该操作会把信号量加1,相加后如果信号量<=0**,则表明当前有阻塞的进程,于是会将该进程唤醒运行;相加后如果**信号量>0,则表明当前没有阻塞的进程。

方式5:信号唯一的异步通信机制
以上介绍的是常规状态下的工作模式。对于异常情况下的工作模式,就需要用信号的方式来通知进程。

产生信号的方式:
硬件来源:ctrl+c产生SIGINT信号,表示终止该进程;ctrl+z产生SIGTSTP信号,表示停止该进程,但还未结束。
软件来源:kill -SINGNAL PID

处理信号的方式:
信号是进程间通信机制中唯一的异步通信机制,因为可以在任何时候发送信号给某一进程,一旦有信号产生,用户处理信号的方式有以下几种:
1、执行默认操作。Linux中针对每个信号都规定了默认的操作,例如,SIGTERM信号,表示对进程终止的意思。
2、捕捉信号。为信号定义一个信号处理函数。信号发生时,执行默认的信号处理函数。
3、忽略信号。不希望处理某些信号时,可以忽略该信号,不做任何处理。

方式6:套接字Socket
解决问题: ** 跨网络与不同主机之间的进程之间通信,就需要socket通信了。(socket也可以用于同一主机**之间的不同进程之间通信)

使用方式:创建socket的系统调用:int socket(int domain, int type, int protocal);

domain:用于指示协议族,AF_INET用于IPV4,AF_INET6用于IPV6,AF_LOCAL/AF_UNIX用于本机。
type:用于指示通信特性,例如SOCK_STREAM表示字节流,对应于TCP;SOCK_DGRAM表示数据报,对应于UDP,SOCK_RAW表示的是原始套接字;
protocal:原本用于指示通信协议,但基本废弃,写为0即可。
类型:根据创建的socket类型不同,通信的方式也不同:

  • 实现TCP字节流通信:socket类型是AF_INET和SOCK_STREAM;
// 在服务器段需要
socket
bind
listen
accept
read

// 客户端
socket
bind
connect
write // 当客户端完成数据传输使会调用close,此时服务端read时会读到EOF,待处理完数据之后会调用close表示连接关闭。
  • 实现UDP数据包通信:socket类型是AF_INET和SOCK_DGRAM;
  • 实现本地进程间通信:【本地字节流】AF_LOCAL和SOCK_STREAM;【本地数据报】AF_LOCAL和SOCK_DGRAM。另外AF_UNIX和AF_LOCAL是等价的,所以AF_UNIX也属于本地socket;和TCP、UDP最大的区别在于本地字节流socket和本地数据报socket在bind的时候不要绑定IP地址和端口,而是绑定一个本地文件。

设计模式

项目问题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值