Linux,数据库,计算机网络以及C++&Java面试问题补充

linux开机的步骤

linux开机步骤

运维的一些小题目

在/tmp/目录下创建test.txt文件,内容为: Hello,World! ,用一个命令写出来:
echo “Hello,World!” > /tmp/test.txt

用vi命令编辑test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一行插入,如何复制5行,删除10行,查找jingfeng的字符、把jingfeng替换为jfedu.net:
末行: G
首行: gg
行首: ^
行末: $
光标行下一行插入: o
复制5行:5yy
删除10行:10dd
替换::%s/jingfeng/jfedu.net/g

查找linux系统下以txt结尾,30天没有修改的文件大小大于20K同时具有执行权限的文件并备份到/data/backup/目录下。
find / -name *txt -mtime +30 -type f -size +20k -perm a=x -exec cp {} /data/backup/ \;

当前test.txt所属的用户为root,组为abc,请将test.txt使拥有者为abc,组为root,写出命令。
chown abc:root test.txt

每次开机在/tmp目录下创建一个当天的日期文件夹(提示:当前日期表示的方法为:date +%Y%m%d)
echo “mkdir /tmp/date +%Y%m%d” >> /etc/rc.d/rc.local

将普通用户test加入root组的命令是?
usermod -G root test

ps: -aux, - ef:显示所有进程的相关信息,-ef是按照bsd版本的格式显示出来

top:
top -p:显示指定的进程号的进程信息
top -S:以累积模式显示程序运行的时间

TCP为什要进行三次握手

如果采用两次的话,会出现下面这种情况。比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。传完东西后,断开。 结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。但是实际上此时A没有数据要传输,造成服务器事件白白的被浪费了。

多重继承为什么会含有多个虚表指针而不是一个?

这个属于编译器厂商做的事情,标准并未规范。C++的父亲就做出过这样的一款编译器原型,通过增大vtbl的体积,每个slot上不只有一个指针,还有一个offset,用来调整this指针的指向。 这样做的弊端是:所有vtbl中的虚函数指针都包含这样一个offset,并且假设不需要调整this指向,调用时还是要做offset的加法操作,尽管offset此时为0。另外,vtbl中每个slot体积的膨胀。这些都是效率问题。

TCP的错误处理

  • connect导致套接字从CLOSED状态转换到SYN_SENT,若失败,则此套接字不可用,必须关闭,不能再次调用connect,需要重新调用socket。
  • 服务器端用listen等待建立连接,在accept之前。维护两个队列:未完成连接队列(SYN_RECV)与已完成连接队列(ESTABLISHED)。
  • 客户发出的SYN在中间路由器发生了“destination unreachable”ICMP错误,客户主机内核保存该信息,按照第一种情况所述时间间隔发送SYN。超时未收到相应,则把保存信息EHOSTUNREACH或ENETUNREACH错误返回给进程。
  • 客户SYN到达之后,TCP在未完成连接队列中创建新的一项,然后响应以三路握手的第二个分节:服务器SYN,在队列中保持直到第三个分节到达或者超时(与connect类似的75s)。
  • 对客户端的响应若是RST,则表明服务器端对应端口没有进程等待与之连接,硬错误,返回ECONNREFUSED错误
  • 如果服务器端队列满,收到客户端SYN,会忽略,而不是发送RST,因为情况是暂时的,可能下次就能够有空闲队。RST会让connect立即返回一个错误。
  • 此处是SYN攻击的发生位置。黑客可以伪造大量不存在的IP地址发送SYN建立连接,服务器需要不断回复确认,但是没有响应,继续重发,占用了等待队列,无法为正常连接服务,堵塞网络,其属于典型的DDOS攻击。如果检测到许多随机的半连接IP地址,基本可以判断为SYN攻击(netstat -n -p TCP | grep SYN_RECV)
  • 如果一方已经关闭或异常终止,而另一方不知道,此时TCP连接为半打开。不传输数据,另一方就不会检测到,(此时可以设置TCP的KEEPALIVE选项,来定时检测),如果发送数据,另一方会返回RST分节。
  • 第四个分节ACK丢失,服务器端(被动关闭)会重发FIN分节。(对照前文,第一个分节发送之后如果没有ack,应该也是超时重发,但此点不确定)
  • TIME_WAIT状态的必要性:(1) 可靠的实现TCP全双工连接的终止。如果四次交换的最后ACK丢失,服务器将重发FIN,客户端需要能够正确处理,发送ACK,如不维护此状态,将发送RST信息,被解释为一个错误。为了可靠结束,必须应对不得不重传最终的ACK。(2)允许老的重复分节在网络中消逝。如果在相同的端口与IP之间建立了新的连接,原来的连接的包经过路由处理又重新发送过来,可能被认为是原来的包,因此TCP不给TIME_WAIT状态建立新的连接。2MSL可以保证所有老的包消逝。
  • RST产生的三个条件: 1) SYN到达目的端口,但是服务器没有对应的监听进程; 2) TCP想取消一个已有连接; 3) TCP收到一个根本不存在的连接上的分节。
  • Nagle算法:其会将很多小的包缓冲,从而避免网络中存在太多的小包(协议头比例非常大)造成拥塞,可以用TCP_NODELAY选项关闭。

TRUNCATE,DELETE,DROP比较:

TRUNCATE TABLE:删除内容、释放空间但不删除定义。
DELETE TABLE:删除内容不删除定义,不释放空间。
DROP TABLE:删除内容和定义,释放空间。
速度: drop> truncate > delete。

HTTP请求所经历的步骤

  1. 建立TCP连接:这其中设计到了DNS协议,ARP协议(先为DNS然后是ARP)
  2. Web浏览器向Web服务器发送请求命令:一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
  3. Web浏览器发送请求头信息:浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
  4. Web服务器应答:客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
  5. Web服务器发送应答头信息:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
  6. Web服务器向浏览器发送数据:Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
  7. Web服务器关闭TCP连接一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。(1.1里面支持keep-alive)

数据库索引的好处以及坏处

好处: 帮助用户提高查询速度, 利用索引的唯一性来控制记录的唯一性, 可以加速表与表之间的连接, 降低查询中分组和排序的时间
坏处: 存储索引占用磁盘空间, 执行数据修改操作产生索引维护

实现一个简单的Malloc,Free

malloc,free的简单实现

GDB常用的调试命令

backtrace(或bt) 查看各级函数调用及参数
finish 执行到当前函数返回,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函 数
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中
break(或b) 行号 在某一行设置断点
break 函数名 在某个函数开头设置断点
break…if… 设置条件断点
continue(或c) 从当前位置开始连续而非单步执行程序
delete breakpoints 删除断点display 变量名
disable breakpoints 禁用断点
enable breakpoints 启用断点
info(或i) breakpoints 查看当前设置了哪些断点
run(或r) 从头开始连续而非单步执行程序
undisplay 取消对先前设置的那些变量的跟踪
watch 设置观察点
info(或i) watchpoints 查看当前设置了哪些观察点

Trie树的相关构造

节点如下:

class TrieNode {
public:
    TrieNode():isLeaf(false)
    {
        for(auto & t : dic){
            t = NULL;
        }
    }
    TrieNode * dic[26];
    bool isLeaf;
};

ARP以及DNS,PING,Traceroute的工作原理

ARP: 主机向自己网络上广播一个ARP请求,其中包含目标的网络地址。这个这个网络上的所有主机都会收到这个请求,但是只有被请求的机器会应答一个ARP应答。
DNS: 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。否则查找本地DNS解析器缓存,是否有这个网址映射关系,没有的话再去,根据/etc/resolv.conf文件,询问DNS服务器,由服务器按照自己的规则去查找对应的IP地址,返回给主机
PING:ping程序向指定的IP地址发送ICMP数据包,通过返回的信息来判断网络的连接状况.发送的ICMP(IP)报文上TTL字段会被设置成一个固定值,Linux里面是64.然后没经过一个路由器减去1.当TTL为0但是还没有到达目的地址的话,那么会回送一个ICMP unreachable报文,通知发其端无法连接到dst。src可能会增大TTL重新发送ICMP报文,几次之后还是连不通的话会报dst不可达的消息。
Traceroute程序的设计是利用ICMP及IP header的TTL。首先traceroute送出一个TTL是1的IP datagram到目的地,当路径上的第一个路由器收到这个datagram时,它将TTL减1变为0,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息。traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute再送出另一个TTL是2 的datagram,发现第2 个路由器…… traceroute每次将送出的datagram的TTL加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当

长连接和短连接

连接->传输数据->关闭连接,短连接是指SOCKET连接后,发送接收完数据后马上断开连接。 因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。这也是HTTP协议无状态的原因之一。
连接->传输数据->保持连接 -> 传输数据->………..->直到一方关闭连接,多是客户端关闭连接。长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
什么时候用长连接,短连接:
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。 比如说qq的维持在线显示状态使用的好像就是长连接,或者是网络游戏这样的,smtp,pop3,telnet这种就可以认为是长连接。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。比如百度的搜索服务,搜索完成之后建立的连接就会断开。

事件与消息的区别

事件是一个动作——用户触发的动作,消息是一个信息——传递给系统的信息。
事件:只能由用户的操作产生
消息:由操作系统产生。由用户触发的事件转换而来。由另一个消息产生。

Struct与Union之间的区别

结构体每个属性都可以有默认值,union只能有一个有默认值

关于虚表

C++ 虚函数表解析

Linux中进程调度方法

SCHED_OTHER: 分时调度方法
SCHED_FIFO: 先来先服务调度算法
SCHED_RR: 实时调度策略,采用的是时间片轮转

TCP三次握手的漏洞

当服务器接受到Syn的时候会会送SYN+ACK,这是连接就处于等待队列(backlog),服务器维护这种半连接也是消耗资源的。这样如果有恶意大量的连接请求SYN到来二一直不发ACK的话,那么服务器的半连接队列就会被占满,会组织正常的用户的访问。这就是SYN FLOOD攻击:通过网络服务所在的端口发送大量伪造原地址的攻击报文,发送到服务端,造成服务端上的半开连接队列被占满,从而阻止其他用户进行访问。它的数据报特征是大量syn包,并且缺少最后一步的ACK回复。
解决方法:
(1).无效连接监控:不停监视半开连接和不活动连接,当半开连接数和不活动连接数到达一定值时候,就释放系统资源。(这样实际上会将正确的连接也释放,不好)
(2).延缓TCB方法:SYN FLOOD的关键是利用了,syn数据报一到,系统就分配TCB资源。那么我们有两种方法资源问题:
Syn cache:这种技术在收到Syn时不急着分配TCB(TCP Control Block),而是先回应一个ACK报文,并在一个专用的HASH表中保存这种连接,直到收到正确的ACK,才分配TCB。
(3).Syn Cookie用一种特殊的算法生成sequence number,算法考虑到对方的信息和己方信息,收到对方的ACK报文后,验证之后才决定是否生成TCB

HTTP协议特点

1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTPS与HTTP的区别

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。细节不再赘述
端口:前者是80,后者是443。
加密:https协议需要到ca申请证书,一般免费证书很少,需要交费。http是超文本传输协议,信息是明文传输
速度:http速度大概为https的8倍左右

hash相关

  1. 线性探测可能会造成主集团问题,但是二次探测可能会造成次集团的问题。
  2. STL中的冲突解决方法是开链法。
  3. STL中的hash表的大小是质数,源码中已经事先将28特定大小的质数计算好,以便随时取用。
  4. hashset和multi_hashset插入的时候调用的是insert_unique以及insert_equal,这样决定了他们插入的时候,前者不能包含重复的,后者可以。

虚表相关

  1. 虚函数表相关
  2. C++虚函数及虚函数表解析
  3. 只有虚函数,或者父类虚函数子类重写这个虚函数的时候会在虚表中出现或者替换父类在虚表中的位置,其他函数不会出现在虚表中。
  4. 父子类都存在虚函数的时候,父类的虚函数较子类的虚函数会放在虚表的前面

求两个树的最大公共子树

什么叫做MVC

  1. 模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
  2. Model(模型)表示应用程序核心(比如数据库记录列表).View(视图)显示数据(数据库记录).Controller(控制器)处理输入(写入数据库记录)
  3. MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

url加载后台的过程

  • DNS过程(查浏览器缓存,本机缓存,路由器缓存,DNS服务器缓存等等)
  • 三次握手建立连接
  • 发送http请求
  • 服务器发送http响应(可能会存在永久重定向等等过程)
  • 断开TCP连接
  • 从输入url到显示网页,后台发生了什么?

static关键字在c++作用

  • 文件中作用:作用域
  • 函数中作用:长生存期,保持值
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux C++面试是指针对Linux操作系统下使用C++编程语言进行面试的过程。在面试中,面试官可能会考察面试者对Linux操作系统的了解程度,以及对C++语言的掌握程度和应用能力。面试题目可能涉及Linux系统调用、进程管理、文件系统、网络编程等方面,同时也会考察面试者的算法和数据结构能力。在准备Linux C++面试时,需要对Linux操作系统和C++编程语言有深入的了解,并且需要多做练习和实践,提高自己的编程能力和解决问题的能力。 ### 回答2: Linux C 作为编程语言,已经成为计算机科学领域必备的技能之一。而要在 Linux C 面试中取得成功,需要拥有以下几个方面的能力: 1. 深入理解 C 语言:Linux C 面试中,需要运用 C 语言编写各种类型的代码,如控制结构、循环、数组处理、指针等。自然而然要有深入理解 C 语言的能力,包括它的基本语法、数据类型、函数等。 2. 熟悉 Linux 操作系统:Linux C 是在 Linux 操作系统上运行的,所以在 Linux C 面试中必须对 Linux 操作系统有深入的了解。这个了解可以包括:Linux 文件系统、进程管理、权限管理、网络协议、Shell 编程基础等。这些知识不仅能显示出你的基本理解,也是帮助你在 Linux C 编写过程中调试常见错误和优化代码的关键。 3. 熟悉常见算法、数据结构:对于需要处理大量数据的 Linux C 项目来说,熟悉常见的算法和数据结构是非常重要的。有足够的实践经验能帮助你对这些知识点进行应用和优化。 4. 熟悉编程工具和开发环境:熟练掌握编程工具和开发环境可以大大提高编写代码的速度和效率。常见的 Linux C 编写工具包括:GCC、Make、GDB、Valgrind、Vim 等,熟练使用这些工具及其选项,可以快速定位问题、修改代码并最大限度地提高代码的质量。 总体来说,Linux C 面试需要你对 C 语言和 Linux 操作系统有深入的理解和熟悉,在业务领域涉足简单的算法和数据结构,以及熟练掌握常用的开发工具等等。 ### 回答3: Linux是一种广泛用于服务器和嵌入式设备的开源操作系统。C语言Linux操作系统中应用程序开发的首选语言之一。因此,在Linux相关岗位的面试中,Linux C的基础知识和应用能力都会成为考察的重点。下面分别从知识储备和实际技能两个方面进行回答。 一、知识储备 1. C语言基础知识:面向对象特性,变量声明、定义、初始化、作用域和存储类别等基础知识。 2. Linux操作系统基础知识:文件系统、进程、文件描述符等常见概念,以及Linux命令行基础使用等。 3. Linux环境编程:理解Linux下的编程模型、系统调用、进程通信、线程和多线程编程、信号处理、文件I/O等。 4. 熟悉Linux下的常用开发工具和调试方法:例如gcc编译器、Makefile的使用、GDB调试器等。 5. 熟悉Linux下常用的网络编程开发:例如socket编程、TCP/IP协议、Http协议等。 二、实际技能 1. 实现基础程序:能够使用编程语言实现一些常见程序,例如hello world等。 2. 编写Linux应用程序:能够掌握Linux环境下的编程模型、系统调用、进程通信、文件I/O等技能,编写Linux环境下的应用程序。 3. 常见命令的使用:能够熟练使用常见命令行工具,例如grep、awk、sed、awk。能够灵活应用shell脚本,快速处理文本文件和操作文件系统。 4. 熟练掌握Linux下的常用开发工具和调试手段:例如gcc编译器、Makefile的使用、GDB调试器等。 5. 熟练掌握Linux下的常用网络编程开发:例如socket编程、TCP/IP协议、Http协议等。掌握HTTP协议和套接字编程等相关技术,能够实现网络应用程序的开发调试和部署等。 总之,在Linux C面试中,除了掌握相关的知识储备外,还需要能够证明自己的实际技能。因此,在准备Linux C面试的过程中,需要注重实践,在不断的实践中加深自己的理解和掌握能力,提高自己的实际能力和水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值