1、进程间的通信方法

  • 管道通信

    • 有名管道——一种半双工的通信方式,它允许无亲缘关系进程间的通信。
    • 无名管道——一种半双工的通信方式,它只允许有亲缘关系进程间的通信。
  • 信号量

    • 一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

    • 信号量用于进程间同步,若要在进程间传递数据,则需要结合共享内存。

    • 信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。

  • 信号

    • 一种比较复杂的通信方式,用于通知接受某个事件已发生。
  • 消息队列

    • 消息的连接表,存放在内核中,并由队列标识符标识。

    • 消息队列是面向记录的,其中的消息具有特定的格式,以及特定的优先级。

    • 消息队列独立于发送和接受进程,进程终止时,消息队列及其内容并不会被删除。

    • 消息队列可以实现消息的随机查询。

    • 可以实现任意进程间的通信,无需考虑同步问题。

  • 共享内存

    • 指两个或多个进程共享一个给定的存储区。

    • 共享内存是最快的一种进程通信方式,因为进程是直接对内存进行存取。

    • 因为多个进程可以同时操作,所以需要同步。

  • socket套接字

    • 可用于不同机器间的进程通信。
    • 适合于客户端与服务器端的信息实时交互。
    • 传输数据时间短、效率高。

2、一个进程可以访问另一个进程的内存吗?

  • 进程与进程之间的内存地址是相互独立的,可以通过通信进行传递消息。

3、C++中的多态是怎么实现的?

  • 多态,顾名思义就是同一事物的在不同场景下的多种状态,可以分为静态多态和动态多态。
    • 静态多态包括函数重载和泛型编程。下面代码就是函数重载:
int Add(int left, int right)
{
    return left + right;
}
double Add(double left, int right)
{
    return left + right;
}

int main()
{
    Add(10, 20);
    //Add(10.0, 20.0);  //这是一个问题代码
    Add(10.0,20);  //正常代码
    return 0;
}
  • 可以发现,函数重载是在编译期间完成的,编译器会根据实参类型调用相应的函数,如果有合适的函数就调用,没有就发出警告或错误。
  • 动态多态——重点

    • 在程序运行时,根据基类的引用(指针)指向的对象,来确定自己具体该调用哪个类型的函数。
  • 动态多态的条件

    • 基类中必须包含虚函数,并且要在派生类中对该虚函数进行重写
    • 通过基类对象的引用或指针调用虚函数。
  • 重写

    • 基类中被重写的函数必须是虚函数。
    • 基类和派生类的原型必须保持一致(返回值类型、函数名称及参数列表)。
  • 扩展——以下函数不能作为虚函数:

    • 友元函数

    • 静态成员函数(没有this指针)

    • 构造函数、拷贝构造函数

    • 全局函数

  • 扩展——抽象类

    • 包含纯虚函数的基类,即为抽象类。
  • 纯虚函数

    • 在虚函数的基础上,让虚函数等于0。相当于一个接口,所在类也叫接口类。纯虚函数必须在派生类中实现重写,否则无意义。

4、const的作用是什么?

  • 阻止一个变量被改变。在定义const变量时,必须对其进行初始化,因为const对象一旦创建就不能修改。

  • 指针来说,可以指定指针本身是const,即常量指针,int *const p;也可以指定指针所指的数据为const,即指针常量,int const *p;。

  • 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。

  • 对于类的成员函数,若指定其为const类型,则表明它是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数

  • 对于类的成员函数,有时候必须制定其返回值为const类型,以使得其返回值不是左值

  • const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内部的所有数据成员。

  • 非const成员函数可以访问非const对象的任意数据成员,而不能访问const对象的任意数据成员。

  • const类型可以通过类型转换符const_cast将const类型转换为非const类型。

5、Linux中的find命令怎么使用?

  • find命令的作用:

    • 在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。当不设置任何参数时,find命令在当前目录下查找子目录与文件,并将查找到的子目录和文件全部显示。
  • find命令格式:

    • find path -option [-print] [-exec -ok | xargs | grep] [commond {};]
  • find命令的参数:

    • path——要查找的目录路径

      • ~ 表示HOME目录
      • . 表示当前目录
      • / 表示根目录
    • options——查找方式

      • -name filename 查找名为filename的文件

      • -perm 按执行权限来查找

      • -user username 按文件属主来查找

      • -group groupname 按组来查找

      • -mtime -n +n 按文件更改时间来查找文件,-n指n天以内,+n指n天以前

      • -atime -n +n 按文件访问时间来查找文件,-n指n天以内,+n指n天以前

      • -ctime -n +n 按文件创建时间来查找文件,-n指n天以内,+n指n天以前

      • -nogroup 查无有效属组的文件,即文件的属组在/etc/groups中不存在

      • -nouser 查无有效属主的文件,即文件的属主在/etc/passwd中不存在

      • -type b/d/c/p/l/f 查是块设备、目录、字符设备、管道、符号链接、普通文件

      • -size n[c] 查长度为n块[或n字节]的文件

      • -mount 查文件时不跨越文件系统mount点

      • -follow 如果遇到符号链接文件,就跟踪链接所指的文件

      • -prune 忽略某个目录

    • print——表示将结果输出到标准输出

    • exec——对匹配的文件执行该参数所给出的shell命令。形式为command {} ;

    • ok——与exec作用相同,区别在于,执行命令前会给出提示,让用户确认是否执行。

    • |xargs——与exec作用相同,起承接作用。区别在于|xargs主要用于承接删除操作,而-exec都可用,如复制、移动等。

  • 6、Linux中的grep命令怎么使用?

  • grep的作用

    • 用于搜索文本文件的内容。
  • 命令格式

    • grep 待搜索文本 文本名

    • grep -n 显示匹配行及行号

    • grep -v 显示不包含匹配文本的所有行

    • grep -i 忽略大小写

    • grep允许对文本文件进行模式查找,即正则表达式。

      • ^a——行首,搜索以a开头的行
      • ke$——行尾,搜寻以ke结尾的行

7、解释一下tcp中的滑动窗口?

  • 滑动窗口是用来实现流量控制的一种技术。

  • 发送端的发送窗口大小不能超过接收端的滑动窗口大小。

  • 当接收端的滑动窗口值降为0时,发送端不再发送数据。此时启动持续计时器,当计时器时间结束时,发送端向接收端发送一个探测报文段,接收端收到探测报文段之后,发送新的窗口值,如果新的窗口值仍为0,则发送端重启持续计时器。