Linux
文章平均质量分 73
sp_13230409636
这个作者很懒,什么都没留下…
展开
-
358-C++、Linux必备知识点
111原创 2022-05-30 15:41:52 · 283 阅读 · 2 评论 -
357-C++、Linux必备知识点
1.int a=4,则对于表达式++(a++)的结果为?答案:不是5!编译不通过,a++的结果为4,++4是不正确的,4是右值,如果改成++(b = a++);结果就是5了2.若变量a是int类型,并执行了语句a=’A’+1.6;则正确的结果是?a的值是字符’A’的ASCⅡ值加上13.decltype和auto都可以用来推断类型,但是二者有几处明显的差异1.auto忽略顶层const,decltype保留顶层const2.对引用操作,auto推断出原有类型,decltype推断出引用3.对解引原创 2022-05-19 16:48:58 · 714 阅读 · 0 评论 -
341-Linux 连接数据库
1.service mysql status 可以查看服务器(数据库)是否启动数据库在开机默认情况下就是启动的启动数据库:service mysql start重新启动数据库:service mysql restart停止数据库:service mysql stop本地连接数据库:mysql -uroot -p密码远程连接数据库:mysql -uroot -h192.168.0.0 -p密码2.show databases;可以显示都有哪些数据库3.root和stu2就是用户名,%表示远程登原创 2022-04-21 22:31:05 · 4911 阅读 · 0 评论 -
322-Linux mysql数据库
1.数据库:就是存放数据的仓库,它是一个按数据结构来存储和管理数据的计算机软件系统,我们口中所说的数据在数据库中存着的这个数据库,其实是一个磁盘上的文件,我们所说的学没学数据库的这个数据库实际上包含了数据库和数据库管理系统2.数据库管理系统(是一个应用程序或者说是一个应用软件): 是数据库系统核心组成部分,主要完成对数据库的操作与管理功能,例如实现数据的存储,查询,修改,删除,及数据库用户的管理,权限管理等3.RDBMS : 关系数据库管理系统(Relational Database Managemen原创 2022-04-10 21:26:32 · 848 阅读 · 0 评论 -
288-Linux 线程同步
Linux/C++线程同步的四种方式:信号量,条件变量,互斥锁,读写锁背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>using namespace std;原创 2022-04-01 15:16:36 · 1002 阅读 · 0 评论 -
278-Linux 脚本编程
1.解释型程序是不能直接执行的,需要解释器解释才能执行,开发效率高,可以很快的完成变成,执行效率低2.编译型代码经过编译生成可执行程序,生成的这个可执行程序可以直接在计算机上执行,执行效率高3.变量变量分为本地变量、参数变量和环境变量,变量没有类型本地变量:#可以起到屏蔽的作用,相当于//获取其他变量的值:str=“hello” s=str这样str和s的值都为hello,∗∗str 这样str和s的值都为hello,**str这样str和s的值都为hello,∗∗str就是取str的值**输原创 2022-03-23 14:13:06 · 608 阅读 · 0 评论 -
274-Linux 脚本编程shell编程
1.C/C++语言属于编译型语言,而脚本、php、python属于解释型语言编译型:执行效率高解释型的执行效率相对较低,它的优势是开发效率高java编译型和解释型都有涉及,它具有编译型的特点,我们写好的代码xx.java是需要通过java的编译器javac把它编译成xx.class,这个xx.class文件是二进制的,但是它不能在计算机上直接执行,能在计算机上执行的二进制文件在Linux上是ELF结尾的,在Windows是PE格式的,这个文件既不是ELF文件也不是PE文件,它需要通过Java的虚拟机去原创 2022-03-22 12:16:53 · 3658 阅读 · 1 评论 -
273-Linux git
1.git分为四个区:工作区、暂存区、代码仓库、远程仓库2.git是分布式代码管理3.是在工作区进行代码的编写4.可以用git init在本地初始化工作区、代码仓库、暂存区5.可以在家目录下执行ls -a找到.ssh文件,然后进入.ssh文件有一个id_rsa.pub文件,这个就是公钥,把别人的公钥添加到我的账号上,这样别人就可以给我发送代码了,就可以共享同一个远程仓库了6.将别人的公钥添加到自己的账号步骤先登录上自己的账号,然后点击设置,进入设置界面设置中有一个ssh公钥,点击进入ssh公原创 2022-03-22 11:24:07 · 829 阅读 · 0 评论 -
272-Linux git
1.svn git 多人协同开发svn是一个集中式的管理,主机A、主机B、主机C都从服务器上下载最新的版本,当一个主机上传了一个新的版本的时候,其他主机也会下载这个最新的版本,服务器中保存有之前的所有版本,如果服务器坏了,就会导致所有的版本没有了,其他主机虽然可以重新上传版本,但是只能上传最新版本,之前旧的版本就没有了,这回带来一些问题,保留旧的版本的用途就是,可能某个版本就是之前的某个项目,稍微改一改就行而git是一个分布式管理,和svn不同,每个主机会把服务器上的所有版本都下载下来,当其中一个主机原创 2022-03-21 23:16:06 · 114 阅读 · 0 评论 -
271-Linux git常用命令
1.svn git 多人协同开发svn是一个集中式的管理,主机A、主机B、主机C都从服务器上下载最新的版本,当一个主机上传了一个新的版本的时候,其他主机也会下载这个最新的版本,服务器中保存有之前的所有版本,如果服务器坏了,就会导致所有的版本没有了,其他主机虽然可以重新上传版本,但是只能上传最新版本,之前旧的版本就没有了,这回带来一些问题,保留旧的版本的用途就是,可能某个版本就是之前的某个项目,稍微改一改就行而git是一个分布式管理,和svn不同,每个主机会把服务器上的所有版本都下载下来,当其中一个主机原创 2022-03-21 17:18:05 · 864 阅读 · 0 评论 -
246-Linux libevent
1.句柄(Handle)在Windows下是句柄,在Linux下就是文件描述符2.事件多路分发器(EventDemultiplexer)通过IO函数实现的,就是IO函数3.事件处理器和具体事件处理器就是回调函数4.编译的时候要加上-levent5.当程序运行时,摁Ctrl+C就会触发一个信号,就会调用信号的回调函数,就会打印出^Csig=2,程序无法通过Ctrl+C退出,可以通过Ctrl+\来退出信号和时间如果都是永久性事件EV_PERSIST,那么Ctrl+C就一直不终止程序而且每隔5秒原创 2022-03-11 18:05:26 · 209 阅读 · 0 评论 -
245-Linux I/O复用函数的使用
1.selectI/O 复用使得程序能同时监听多个文件描述符,这对于提高程序的性能至关重要。通常,网络程序在下列情况下需要使用 I/O 复用技术:①TCP 服务器同时要处理监听套接字和连接套接字②服务器要同时处理 TCP 请求和 UDP 请求③程序要同时处理多个套接字④客户端程序要同时处理用户输入和网络连接⑤服务器要同时监听多个端口需要指出的是,I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依处理其中的每一个文原创 2022-03-11 09:14:23 · 104 阅读 · 0 评论 -
244-Linux epoll
1.epoll和poll相比有什么区别?答案:epoll是Linux平台特有的,select和poll在Linux和Windows平台中都有,epoll的出现是为了解决客户端数量越来越多(描述符多)的场景poll每次循环都需要把收集描述符的数组从用户空间拷贝到用户空间中,当数组大小非常大时,就会浪费资源,而epoll从头到尾只需要拷贝一次select和poll只是知道n个描述符里面有m个描述符有请求,但是不知道具体是哪一个,它只能通过遍历的方式一个一个比对,当随着客户端数量急剧增长的时候,所需要的时间原创 2022-03-10 18:38:56 · 861 阅读 · 0 评论 -
243-Linux poll
1.Linux系统三种IO复用的方法:select、poll、epoll2.epoll是Linux系统特有的3.poll就像是一个加强版的select,有更多的事件类型,可以检测更多的描述符,它们并没有本质上的变化4.运行结果图5.服务器端代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/select.h>#include <string.h原创 2022-03-10 17:56:45 · 105 阅读 · 0 评论 -
242-Linux IO复用方法select
1.为什么要有IO复用方法?之前实现tcp服务器的并发是通过多线程或者多进程来实现的,它每增加一个客户端,就会创建一个进程或者线程去处理客户端的请求,当客户端的数量达到成千上万的时候,不可能通过创建成千上万的进程或者线程去处理客户端的请求,它的效率是非常低的,所以有了IO复用方法,来更好的解决上述问题2.IO复用方法可以在单个线程或者单个进程内就可以做到同时处理成千上万个客户端的请求3.当从键盘上输入数据的时候,就会立即打印出输入的数据,如果5秒内没有检测有数据的输入,就会打印出time out4原创 2022-03-10 11:12:05 · 686 阅读 · 0 评论 -
241-Linux 线程的创建与同步
1.线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程2.线程的实现方式在操作系统中,线程的实现有以下三种方式:①内核级线程②用户级线程③组合级线程3.Linux中线程的实现Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。Linux 把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的 task_struct,所以在内核中,它看原创 2022-03-09 18:50:47 · 132 阅读 · 0 评论 -
240-Linux HTTP代码实现
1.http协议是应用层协议,默认端口是80,在传输层使用的是tcp协议2.http报文每一行后面都有一个\r\n3.直接运行是不行的,我们需要用管理员身份去运行,只有管理员才能使用1024以内的端口原创 2022-03-09 18:41:28 · 269 阅读 · 0 评论 -
239-Linux TCP协议和UDP协议
1.TCP 协议提供的是:面向连接、可靠的、字节流服务。使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP 连接是全双工的,双方的数据可以通过一个连接进行读写。完成数据交换之后,通信双方都必须断开连接以释放系统资源。使用 tcpdump 可以抓包观察 TCP 连接的建立与关闭。该命令需要管理员权限,格式如下(假设两个测试用的主机 IP 地址为 192.168.43.214 和 192.168.43.160 )原创 2022-03-09 12:02:05 · 2376 阅读 · 0 评论 -
238-Linux HTTP协议和Web服务器
1.浏览器与服务器的通信过程浏览器与 web 服务器在应用层通信使用的是 HTTP 协议(超文本传输协议),而 HTTP 协议在传输层使用的是 TCP 协议。那么浏览器需要和 web 服务器三次握手建立连接后,才可以发送 HTTP 请求报文,服务器收到请求报文后,向浏览器回复 HTTP 应答报文。浏览器向服务器发起连接前,需要得到服务器的 IP 及端口。用户在浏览器中通常只输入网址(网站域名),浏览器会通过 DNS 服务查询获取到服务器的 IP 地址。 对于端口来讲,使用 HTTP 协议的程序一般默认使用原创 2022-03-09 11:10:33 · 2268 阅读 · 0 评论 -
237-http和https的区别
1.HTTP与HTTPS的区别①安全性上,HTTPS是安全超文本协议,在HTTP基础上有更强的安全性。简单来说,HTTPS是使用TLS/SSL加密的HTTP协议②申请证书上,HTTPS需要使用ca申请证书③传输协议上,HTTP是超文本传输协议,明文传输;HTTPS是具有安全性的 SSL 加密传输协议④连接方式与端口上,http的连接简单,是无状态的,端口是 80; https 在 http 的基础上使用了ssl协议进行加密传输,端口是 4432.HTTP的工作过程HTTP由请求和响应构成,是一个原创 2022-03-09 10:59:02 · 147 阅读 · 0 评论 -
236-Linux http协议
1.http协议是应用层协议2.使用的端口是知名端口:803.http协议在传输层使用的是tcp协议4.https默认的端口号是4435.http和https的区别?6.http请求方法7.http报文的应答状态码8.当在浏览器中输入www.baidu.com后都发生了什么?答案:计算机不能直接使用域名去找服务器,找服务器只能通过ip地址,所以会通过DNS域名系统来找www.baidu.com对应的服务器的ip地址,DNS是一级一级往上找的,先从低级别的开始找,每上升一个级别,需要搜索的也就原创 2022-03-08 21:56:23 · 487 阅读 · 0 评论 -
235-Linux udp协议
1.tcp和upd的特点tcp特点:面向连接、可靠、流式服务udp特点:无连接、不可靠、数据报服务2.先运行服务器再启动客户端后,重启服务器,客户端再给服务器发送消息,请问,服务器能收到消息吗?答案:udp是无连接的,udp的客户端和服务器端是不建立连接的(严格来说udp没有客户端和服务器端),udp的客户端可以直接给服务器发送数据,发送成功就成功了,发送不成功就不成功,没有应答确认、超时重传等机制,应答确认、超时重传等机制是tcp特有的,以此来保证可靠性,但是udp是没有的,相比之下,udp的效率原创 2022-03-08 21:13:12 · 2008 阅读 · 0 评论 -
234-Linux tcp多线程、进程并发
1.tcp特点:面向连接的可靠的流式服务2.建立连接是通过三次握手完成的,是在客户端connect时开始进行三次握手,关闭连接是通过四次挥手完成的,客户端close的时候开始进行四次挥手3.可靠性的体现:①应答确认②超时重传③乱序重排④去重⑤滑动窗口来进行流量控制4.流式服务send将数据发送到客户端的发送缓冲区中,由tcp报文段发送到服务器的接收缓冲区中,服务器通过recv接收服务器端接收缓冲区的数据,这就是流式服务注意:send()成功只能说明数据成功的到达了客户端的发送缓冲区,不能原创 2022-03-08 13:33:18 · 1191 阅读 · 0 评论 -
233-Linux tcp通信
1.客户端connect开始执行三次握手,客户端close开始执行四次挥手2.tcp的服务器端和客户端是面试的时候最有可能考的,必须要会3.什么情况下会导致服务器端bind绑定的时候失败?答案:端口被占用或者ip地址错误4.服务器端listen函数中的第二个参数在Linux系统中指的是已完成三次握手的队列的长度,在Unix系统中指的是未完成三次握手队列和已完成三次握手队列大小之和5.服务器端recv的返回值等于0是唯一可以判断客户端关闭了连接的一个依据,不管是客户端close了还是说客户端的进程原创 2022-03-07 11:41:00 · 470 阅读 · 0 评论 -
232-Linux tcp通信
1.传输层:两台不同主机上的两个进程的通信2.tcp/ip 应用层 传输层 网络层 数据链路层应用层发送一个"hello",到传输层以后会变成 tcp “hello”,当到了网络层以后会变成 ip tcp “hello”,到数据链路层以后会变成 帧头 ip tcp “hello” 帧尾3.tcp和udp的特点tcp特点:面向连接的、可靠的流式服务upd特点:无连接的、不可靠的数据报服务tcp的可靠性是有开销的,tcp为了可靠性付出了一些的代价4.通过套接字可以进行数据的收发5.创建套接原创 2022-03-07 10:38:09 · 477 阅读 · 0 评论 -
231-Linux网络编程TCP
1.主机字节序列和网络字节序列主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同。大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。在两台使用不同字节序的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时规定整形数据使用大端字节序,所以也把大端字节序成为网络字节序列。对方接收到数据后,可以根据自己的字节序进行转换Linux 系统提供如下 4 个函数来完原创 2022-03-05 22:12:15 · 584 阅读 · 0 评论 -
230-Linux线程回顾+网络基础概念
1.什么是进程?进程就是一个正在运行的程序2.什么是线程?线程就是进程内部的一条执行路径或者执行序列3.线程从操作系统的角度来看分为三种:用户级线程、内核级线程、组合模型Linux平台线程是一个内核级线程Linux上线程的实现:用户、内核、组合用户级线程:由用户管理和创建,创建开销小,可以创建很多用户级线程,但是无法利用多个处理器的资源用户级线程,内核并不能感知到线程的存在,是我们用户空间线程库中的代码来进行线程的创建、管理、销毁、切换,简单来说就是内核认为我只有一条执行路径,用户空间自己把他原创 2022-03-05 16:46:09 · 777 阅读 · 0 评论 -
195-Linux线程安全
1.线程是进程内部的一条执行路径,或者执行序列2.进程是一个正在运行的程序3.单线程和多线程4.线程接口创建线程 pthread_create()退出线程 pthread_exit()等待线程结束 pthread_join()5.线程同步的方法①信号量②互斥锁③条件变量④读写锁6.线程的实现①用户级线程:用户空间可以创建多条线程,但是在内核空间中只有一条执行路径,内核不能感知多个线程的存在,优点是创建开销小,由线程库中的代码管理,缺点是无法使用多个处理器的资源②内核级线程:要求内原创 2022-02-12 00:20:08 · 594 阅读 · 0 评论 -
126-Linux进程间通信(IPC)机制
进程间通信(IPC)的方式有哪些:1.管道:有名管道,无名管道2.信号量3.共享内存4.消息队列5.套接字每个进程是一个独立的个体将a进程的数据拷贝到b进程的数据,可以通过设置一个文件作为中间文件,将a进程的数据写到文件中,再把文件中的数据读到b中,但是这种方法不太好,因为文件是在磁盘中存储的,I/O速度较慢,所以系统采用的方式不是这种ps -ef | grep “bash”:中的 | 就是一个管道,grep是过滤的意思,只过滤有有"bash"内容的数据mkfifo a:mkfifo是创建原创 2021-12-03 21:25:49 · 385 阅读 · 0 评论 -
109-Linux信号
1.信号:通知进程产生了某个事件向进程发送信号(kill()函数),然后进程响应(signal)响应的三种方式:默认、忽略(知道了但是不处理,比如说上课的时候手机响了,自己知道手机响了,但是不管)、自定义(比如上课的时候手机响了,我让一个人去接一下),不说明就是默认的方式自定义忽略1:SIG_IGN默认0:SIG_DFL 不写的话相当于默认中端中断(Crtl+C) #define SIGINT 2signal(SIGINT,函数指针(函数名作为入口参数))Crtl+\可以退出原创 2021-11-27 14:12:35 · 289 阅读 · 0 评论 -
103-Linux 在自己的bash中运行自己路径的自己写的命令
一:知识点我们在自己的bash中运行命令,运行的命令还是系统默认路径下的命令,我们这次要求改成默认执行我们自己写的命令当我们输入一个命令时,系统会从默认路径寻找与之匹配的命令拼接路径:如果已经给出了路径,就不进行拼接了(如./main /home/stu/main /usr/bin/pwd),如果给出的是一个命令(如ls ps),就要去拼接路径二:实现默认执行自己的命令...原创 2021-11-22 16:45:01 · 1028 阅读 · 0 评论 -
99-Linux 实现自己的命令解释器(mybash)
Shell命令解释器统称内置命令:是在bash中直接实现的 cd,exit普通命令:ps ls 是通过forl+exec实现的静态变量的生命周期和全局变量一样?代码:创建一个命令解释器原创 2021-11-21 18:04:03 · 1448 阅读 · 0 评论 -
73-Linux进程替换(exec系列)
一:知识点1.exec系列的方法,有6个(execl,execlp,execle,execv,execvp,execve)前5个是库函数,最后一个是系统调用, 这6个本质上没有什么区别,前5个的实现最后都是通过调用最后一个方法实现的2.替换的时候PCB是不换的,只是把进程的实体替换掉了,然后PCB中的name改成了替换后的进程的名字,但是PCB的pid号是不变的3.新进程的产生就是先复制再替换(fork+exec),进程就是这么得来的,没有直接创造新进程的方法4.最好用的命令解释器:bash,命令解原创 2021-11-08 11:04:04 · 252 阅读 · 0 评论 -
72-Linix文件描述符
回顾:内核:操作系统的核心open write read close 都是系统调用printf()是通过调用write来实现的PCB进程控制块进程描述符==struct tast_struct 他们是等价的标准输入:键盘0标准输出:屏幕1标准错误输出:屏幕219:33fork()的时候复制了文件表,但是struct file是父进程和子进程共享的总结:父进程打开的文件fork后,子进程也可以访问,并且共享文件偏移量程序启动后,默认有三个文件打开(标准输入0、标准输出1、标准错误输原创 2021-11-08 08:55:04 · 136 阅读 · 0 评论 -
71-Linux文件操作的系统调用
1.文件操作的系统调用,他们的实现在内核(操作系统)中①open() ②read() ③write() ④close()2.C语言中的fopen()是一个库函数,他调用的是open(底层的系统调用)fopen是靠open实现的,无论上层分了多少与文件有关的函数,从底层来讲就只有4个与文件有关的函数3.Linux不分文本文件和二进制文件,在Linux上没有什么区别,只有windows才分4.最底层是计算机硬件,硬件之上是操作系统(内核),用户和内核直接有系统调用,通过系统调用可以进入内核原创 2021-11-05 17:33:30 · 437 阅读 · 0 评论 -
63-Linux如何解决僵死进程
回顾:1.虚拟地址空间 0x0000 0000 ~ 0xffff fffff 上面1G供内核使用,下面3G供用户使用代码段从0x0804 8000开始 0x0000 0000~0x0804 8000是空闲的fork()的时候会把整个虚拟地址空间都复制(即整个进程的实体)逻辑地址(虚拟地址)和物理地址(绝对地址):打印的时候打印的都是逻辑地址,打印物理地址没有意义(程序结束,再运行,这时的物理地址又不一样了,但是物理地址也是可以打印的,只不过没有意义),只有运行程序的时候才会分配物理地址原创 2021-11-02 10:01:42 · 358 阅读 · 0 评论 -
44-fork()复制进程
一:知识点1.fork()复制进程(但是不是复制代码)2.进程:进程就是一个正在执行的程序3.程序和进程不同程序:像是菜谱 main.exe/main进程:照着菜谱在厨房做菜的过程(正在进行) ./main4.PCB:进程控制块 P进程C控制B块5.复制出来的子进程并不是从头开始运行的,而是从fork()后面的语句开始执行6.两个程序同时执行,执行结果交替输出,父进程先打印子进程再打印和子进程先打印父进程再打印没有关系,都是正确的,多进程的运行结果可能是不确定的,但是都是正确的7原创 2021-10-24 16:38:55 · 495 阅读 · 0 评论 -
43-Linux系统有关printf()函数缓冲区的问题
一:知识点1.printf()会把数据先存入缓冲区,然后再打印到屏幕上那么什么时候数据才会从缓冲区打印到屏幕上?①缓冲区满②程序结束时③强制刷新缓冲区,方法有:\n fflush(stdout);2.Linux上不用return 0; 而是 exit(0);//退出进程Linux系统 0代表成功,其他(如1 -1)代表失败Windows 1代表成功,其他(如0)代表失败3.sleep()函数:使程序睡眠3秒,这个函数包含在<unistd.h>这个头文件当中s原创 2021-10-23 16:23:11 · 563 阅读 · 0 评论 -
42-Linux压缩包和释放包
一:压缩成tar包:1.tar cvf my.tar main.c passwd:把main.c和passwd压缩成tar,名字为my.tar2.tar xvf my.tar :把my.tar释放出main.c passwd二:压缩成压缩包:3.gzip my.tar:将tar包压缩成压缩包my.tar.gz4.gzip -d my.tar.gz:将my.tar.gz解压成my.tar5.tar xvf my.tar:将my.tar释放出main.c passwd三:将压缩包一步释放出文件原创 2021-10-22 16:54:29 · 340 阅读 · 0 评论 -
41-Linux多行的拷贝粘贴替换等操作
1.复制n行:nyy2.粘贴:p (粘贴到光标所在行的下一行)3.u:撤销4.ctrl+r:恢复一次撤销5.ndd:删除n行 (从光标所在的一行开始删除n行)6.r:替换一个字符7.R一直替换,按Esc结束8.cc:清楚光标所在的一行(但是这一行并不会消失),然后从这行开始输入9.C:从光标所在的位置清除到行末10.删除一个字符:x11.gg:光标移动到第一行12.G:光标移动到最后一行13.:set nu 显示行号14.:set nonu 取消显示行号15.:n原创 2021-10-22 16:43:19 · 1373 阅读 · 0 评论