linux相关

一、shell下知道哪些命令,要求回答关于进程操作等命令:

Linux下常用命令:进程管理


init:进程初始化控制
killall:根据名称结束进程
nice:设置进程优先级
nohup:以忽略挂起信号方式运行程序
pgrep:基于名字查询并显示进程号
pidof:查找正在运行程序的进程号
pkill:向指定的进程发送信号
ps:显示系统当前的进程状态
pstree:用树形图显示进程的父子关系
renice:调整进程优先级
w:显示当前登录用户的相关信息
watch:全屏方式显示指定命令的输出信息

Linux下常用命令:编程相关指令


awk/gawk:模式扫描与处理语言
expr:计算表达式的值
gcc:GNU的C语言编译器
gdb:GNU调试器
ldd:显示共享库依赖
make:工程编译工具
nm:显示目标文件的符号表
perl:perl语言的命令行工具
php:PHP脚本语言命令行接口
test:条件测试

Linux下常用命令:文件与目录操作


basename:从文件名中去掉路径和扩展名
cd:切换当前工作目录到指定目录
chgrp:改变文件所属组
chmod:改变文件的权限
chown:改变文件的所有者和组
cp:复制文件或目录
dd:复制文件并转换文件内容
file:确定文件类型
find:在指定目录下查找文件并执行指定的操作
ln:创建文件链接
locate/slocate:快速定位文件的路径
ls/dir/vdir:显示目录内容
mkdir:创建目录
mv:移动或重命名文件
pwd:显示当前工作目录
rename:重命名文件
rm:删除文件或目录
rmdir:删除空目录
touch:修改文件的时间属性
updatedb:创建或更新slocate数据库
whereis:显示指令程序、源代码和man手册页
which:显示指令的绝对路径

Linux下常用命令:shell指令


alias:定义命令别名
bg:将作业(或任务)放到后台运行
bind:显示或设置键盘配置
declare:声明shell变量
dirs:显示shell目录堆栈中的记录
echo:打印字符串到标准输出
enable:激活与关闭shell内部命令
eval:执行指定指令并返回结果
exec:执行给定指令后退出登录
exit:退出当前shell
export:设置与显示环境变量
fc:编辑并执行历史命令
fg:将后台任务(或作业)切换到前台运行
hash:显示与清除指令时运行查询的哈希表
history:显示与操纵历史命令
jobs:显示shell的作业信息
kill:杀死进程或作业
logout:退出登录shell
popd:从shell目录堆栈中删除记录
pushd:向shell目录堆栈中添加记录
set:设置shell的执行方式
shopt:设置控制shell行为变量的开关值
ulimit:设置shell的资源限制
umask:设置创建文件的权限掩码
unalias:取消由alias定义的命令别名
unset:删除定义的变量或函数

Linux下常用命令:用户管理


chfn:改变用户的finger信息
chsh:改变用户登录时的默认shell
finger:用户信息查询程序
gpasswd:管理组文件/etc/group
groupadd:创建组
groupdel:删除组
groupmod:修改组信息
groups:显示用户所属的组
grpck:验证组文件/etc/group的完整性
grpconv:启用组的影子口令文件
grpunconv:关闭组的影子口令文件
logname:显示登录用户名
passwd:设置用户密码
pwck:验证用户文件密码文件的完整性
pwconv:启用用户的影子口令文件
pwunconv:关闭用户的影子口令文件
su:切换用户
useradd:创建用户
userdel:删除用户
usermod:修改用户的配置信息
users:显示当前登录系统的用户名

二、如果某一进程造成CPU满了,是什么原因造成的,如何解决?

(1)如果一个进程有多个线程在 同时 运行,那么cpu占满是不可能的,每个线程本来就是会被操作系统分配时间片的,如果3个线程同时运行,那么只有问题线程所使用的30%是满的,所以cpu总体使用率可能是30%以上,但不可能达到100%。
(2)如果线程设置了优先级的前提下,发生cpu满了,那很明显就是优先级最高的那个线程出的问题。
(3)线程如果不是一直运行的,而是运行完就关闭的,那么也有可能在某个cpu高的时刻,只有一个线程在运行,此时,加log看看是哪个线程即可。

三、如何查看系统性能/系统监测的命令

(1)一般我们查看系统性能主要是在以下几个方面

1)用户使用CPU情况 展现为 %user

2)系统使用CPU情况 展现为 %sys

3)wio或iowait     展现为 %iowait 进程由于等待磁盘IO而使CPU处于空闲状态的比率

4)CPU的空闲率

5)CPU上下文的交换的比率,也有说明为CPU上下文的切换。即内存和寄存器中数据的切换

6)nice 这个还不是很明白是啥意思

7)real-time 还是未知

8)运行队列的长度

9)平均负载

(2)常用命令

1)mpstat

2)top

3)vmstat

4)sar

5)iostat

6)uptime

四、TCP与UDP的区别

TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保   证可靠交付

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

  UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

五、用过tcpdump吗?干什么用的?

TcpDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

六、accept发生在什么阶段

tcp三次握手的过程,accept发生在三次握手哪个阶段?

第一次握手:客户端发送syn包(syn=j)到服务器。 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。 
三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接

七、三次握手分别干的是什么?

TCP握手协议 :在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

1、第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)

2、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 

3、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

所谓的三次握手(three times handshake;three-way handshaking)即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。

为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。

八、可以两次握手吗?

三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。

(1)TCP 的三次握手过程:主机A向B发送连接请求;主机B对收到的主机A的报文段进行确认;主A再次对主机B的确认进行确认。

(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。

为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

不能改成两次,第三次是为了防止已经失效的连接请求报文段突然又传到了服务器端,因而发生错误。客户端有可能因为网络阻塞等原因会发送多个请求报文,这时服务器就会建立连接,浪费掉许多服务器的资源

九、三次挥手可以吗?

第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。

第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。

第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。在这个过程中,通信双方的状态如下图,其中:ESTAB-LISHED:连接建立状态、FIN-WAIT-1:终止等待1状态、FIN-WAIT-2:终止等待2状态、CLOSE-WAIT:关闭等待状态、LAST-ACK:最后确认状态、TIME-WAIT:时间等待状态、CLOSED:关闭状态

没有必要四次,是为了提高传输效率,不能三次挥手,因为中断需要双方都发fin和ack,如果是3次挥手的话会有一方处于没有收到ack的状态,一脸蒙逼在等对端确认断开链接。

十、static关键字在C++中用法

static的作用有三种:限制变量或函数作用域、保持变量内容的持久、默认初始化为0

1、被static关键字修饰的全局函数或者变量具有文件作用域,即只在当前文件中可见。

2、被static修饰的变量会被存储在静态存储区,生命周期也为从定义直至程序结束。对于局部变量,即使在函数退出后该静态变量依然存在,然而却也无法访问。此外,static修饰的变量一生只会被初始化一次(这点经常被用作面试的小题,需注意)。

3、正是因为被static修饰的变量会被存储在静态存储区,所以才有了这个一条。因为静态存储区的变量会被默认初始化为0。

static也可以修饰C++的类成员变量和类成员函数

1、类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。

2、静态成员函数不含有this指针,所以可以作为回调函数。但同时为了可以访问类的成员变量可以将对象的this指针当做实参传入回调函数中。

3、静态成员函数在类定义体外定义时不能加static关键字修饰,因为成员函数本是类作用域,而在类外用static修饰会将其作用于扩大为文件作用域,所以是不合理的。

4、静态成员变量并不像一般的成员变量在构造函数中初始化,而是在类的实现文件中初始化,即必须在.cpp文件中初始化,否则在程序链接时会出错,重定义,且初始化时无需再使用static关键字修饰。

5、static修饰的const成员变量可以再类中被定义时初始化。

十一、HTTP返回码

HTTP 返回码详解_kongxianglei5313的博客-CSDN博客_http 返回码

十二、动态库与静态库的区别

从编程的角度来讲,库文件通常被分为静态库文件和动态库文件,其目的在于将部分代码封装在一起编译后供自己或他人调用,好处在于编译后的库文件看不到源代码,可保密,同时不会因为不小心修改了函数而出问题,便于维护。但是二者之间存在一定的差异。
    1.静态库:
    静态库在Windows操作系统中是.lib文件,在Linux下是.a文件,相当于中间(.o)文件的集合,是在程序链接时使用,讲静态库中的文件直接合成到最后的可执行文件中去,程序运行时,则不再需要静态库的支持。在linux下静态库的生成及使用方法如下:
    (1)将所有的源文件编译生成中间文件命令如下:
     gcc -c *.c
    (2)生成libxxx.a文件(这里的lib是必须有的,与后面的自定义的一起构成库文件名称)命令如下:
     ar crv libxxx.a *.o
    (3)静态库的使用
     gcc -o main main.c -L路径 -l库名(这里的main.c是自己的代码名称)
    2.动态库(共享库)
    动态库在Windows操作系统中是.dll文件,在Linux操作系统下是.so文件,动态库的使用是在使用动态库的程序运行起来后,动态地将动态库加载到内存上去执行,可以总结为不可执行的可执行文件。在Linux下动态库的生成及使用方法如下:
    (1)生成libxxx.so文件(这里的lib是必须有的,与后面的自定义的一起构成库文件名称)命令如下:
     gcc -shared -fPIC -o libxx.so *.c
    (2)动态库的使用
     gcc -o main main.c -L路径 -l库名(这里的main.c是自己的代码名称)
    (3)使用动态库的程序在运行时,需要单独搜索并加载动态库文件,做法如下:
     a.将动态库拷贝到/lib或者/usr/lib任意一个路径下
     b.设置环境变量
     c.修改配置文件
     区分静态库和动态库除了以上说的几点外,还有一点可以很快区分。静态库删除后程序无法使用,而动态库删除之后程序照样可以正常运行。 

十三、K-V 数据库

就是现在非常热门的NoSQL,非关系型数据库,主要存数结构是key-value,其中value有的采用Json串结构。key- vlalue 键值对 。

十四、GO语言

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

不同于Java,Go内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值