Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
linux系统的核心,控制着计算机系统的所有硬件和软件,主要负责:系统内存管理,软件程序管理,硬件设备管理,文件系统管理。提供系统最核心的功能,调度cpu,内存分配,文件系统网络等等,主要包含对硬件的调度。
GUN包括文件,文本,进程实用工具。其中,shell是一种特殊的交互式工具。shell为用户提供了启动程序,管理文件,管理进程的途径。shell的核心是命令提示符,用来负责交互,然后解释命令在内核中执行。shell可以实现对文件的复制移动删除显示等基本操作,也可以把shell命令放在文件中作为shell脚本执行,为执行多个命令带来了极大的便利。在linux系统中,有不同的shell可以选择,如:bash shell,ash,korn,tcsh,zsh。
背景:linus创建了Linux内核,但他手上没有运行其上的系统工具,幸运的是GUN组织开发了一套完整的开源的Unix实用工具,(Unix系统原型:参与Multics项目的工程师休假期间问世,给工程师放假是多么重要的事~),于是linus的Linux内核和GUN的操作系统实用工具集合在一起,产生了一款完整且free(自由!)的操作系统。通常将linux内核和GUN工具结合统称为Linux。(它们彼此的相遇如同一场绝美的长吻,散发出如怡然的甜蜜和永恒的光荣)
linux初期,只有一个文本界面可用,随着windows的流行,linux图形化桌面渐渐产生。同样有多种选择:早期的X windows,KDE Plasma,以及GNOME(现流行)
包含完整组件的linux系统包称为linux发型版,如:Red Hat ENter prise,Debian,Ubuntu,Gentoo等等,种类相当的丰富。
在linux中,shell用于合并编程语言以控制进程和文件,以及启动和控制其他程序;shell用于减少大量的重复输入和交互操作,能够进行批量的处理和自动化完成维护,减轻管理层的负担;shell是一个用户跟操作系统之间交互的命令解释器。也许在windows下我们常依赖鼠标和发达的图形化程序进行开发,但在linux系统下,使用shell是更高效的和应用程序进行交互的手段,是linux下开发必须掌握的技能。
在图形化出现以前,和unix系统交互的唯一方式就是使用shell提供的文本命令行界面(CLI)。进入CLI的一种方式是,Linux系统的文本模式,该模式只提供一个shell CLI,这称为Linux控制台,模拟的是早期硬接线控制台终端。
然而在图像化环境提供了多种方式来访问命令行界面,如:GNOME Terminal,Knosoleh和xterm。其中red hat,ubuntu,centos采用GNOME桌面环境,所以也默认使用GNOME Terminal,并且易于上手。
由于学习linux系统如果直接覆盖掉我们经常使用的windows系统会给我们带来许多不便,所以我们可以使用虚拟机模拟虚拟计算机搭建linux环境进行学习,使用linux内核镜像和图形化界面搭建环境。
跨越虚拟机操纵linux很不方便,存在复制粘贴,文件上传下载各种问题,所以可以选择使用第三方软件远程连接到linux系统,如Finalshell和Xshell,虚拟机可以后台运行。
以下内容主要包含:如何使用shell的提供的基本命令来处理linux文件和目录
man:查找手册
man+name
显示对应指令的详细信息mna -k name
关键词查找pwd
显示当前路径信息cd:切换工作目录
cd
直接返回家目录cd+绝对路径
切换到对应目录(/开头绝对路径)cd +name
切换到当前工作目录下名为name的目录中cd+..
返回上一层目录ls:列出文件和目录
ls
显示当前目录下的文件和目录ls -F
区分文件类型的显示(如目录后+/,可执行文件后+*)ls -a
显示隐藏文件ls -R
递归的显示当前目录以及子目录中包含的文件ls -l
显示长列表,包括文件类型,权限,大小,时间戳,名称等信息ls -i
显示inode编号通配符过滤列表:
ls -l appl?
显示appl+单个未知字符的所有文件ls -l app*
显示所有以app开头的所有文件ls -l [a-z]pple
显示所有名称满足(a~z)pple的文件ls -l [ab]pple
显示apple和bpple的文件,如果存在ls -l [!a]pple
显示第一个字母不是a且后续为pple名称的文件列表上述几种通配符可以灵活搭配使用
touch:创建文件
touch+name
当前目录常见名为name的文件cp: 复制文件
cp name1 name2
复制当前目录下的name1并生成新文件name2-i
会询问是否覆盖已有文件cp name1+路径/
把name1文件复制到新的路径中去,名称和原来一样。路径后记得加/cp /路径下的某文件a .
注意:一个点代表当前目录,把某路径下的a文件复制到当前目录cp -R 路径1/ 路径2/
把路径a中所有内容赋值到路径2里面,有的gnome终端版本会把前面目录整个复制过去,实际情况实际考虑。cp可以搭配通配符
tab:命令行补全
tab
,根据前缀匹配结果ln:链接
ln -s a b
软链接,将b链接到a,a和b是不同的文件,inode编号不同ln a b
硬链接,两者本质是同一个文件只有同一设备进行硬链接,不同设备文件只能使用软连接
mv:重命名,移动
mv sad happy
把sad文件名改为happymv 路径1/文件a 路径2/
把路径1下的a移动到路径2,这是剪切mv 文件a 路径2/name2
把文件a移动到路径2下,顺便重命名为name2mv 目录a 目录b
把a目录及其子目录移动到b目录下rm:删除文件
rm -i 文件a
删除文件a并询问rm -i -r 目录名
递归的询问删除目录中的子文件,有的终端也可以把目录也删除掉rm -rf
删除目录树,危险危险危险,慎重使用mkdir,rmdir:目录管理
mkdir a b c
分别创建abc目录mkdir -p a/b/c
创建目录及子目录rmdir 目录a
删除空目录a,rmdir只能删空目录,没有-i,要先删目录里的文件查看文件
file 文件名
查看文件类型cat 文件名
打开整个文档查看内容cat -n
显示行号cat -b
显示行号不包含空行more 文件名
可翻页,不会一下全打开less 文件名
可翻页,支持上下键,空格翻页,enter下一行tail -n number
显示制定最后num行内容head -n number
显示制定前num行内容,不加-n直接加数字也可以配置环境:
在linux上下载安装gcc,g++,gdb调试器,camke,vim编辑器,vscode。
(gcc , g++分别是gnu的c & c++编译器)
源文件生成可执行程序
g++ hello.cpp -o hello
-g
源文件生成带有调试信息的可执行文件
g++ -g hello.cpp -o hello
-o,-on(0~3)
优化源代码,处理一下十分垃圾的代码,提高效率
time可以显示运行时间
time ./hello.cpp
-l
指定程序要链接的库,后加库名。本地的库可以直接链接使用。
-L
/lib,/usr/lib,/usr/llocal/lib
不在上述三个目录中,则L后加库文件所在的目录名
-I (大写i)
指定头文件所在目录,若在/usr/include中不用指定,若不在就要去指定。
-Wall
打印警告信息
-w
关闭警告信息
-std=c++11
设置编译标准
-o
指定输出文件名称,linux中不加-o会默认生成a.out文件
-D
定义宏,常用:-DDEBUG 用此开选择开启火关闭debug宏
g++ main.cpp -Iinclude
注意指定头文件
g++ mian.cpp -Iinclude -Wall -o swap
加多个参数
cd src
g++ -c swap.cpp
ar rs swap.o libswap.a swap.o
cd ..
g++ main.cpp -Iinclude -lswap -Lsrc -o static_main
g++ swap.cpp -fpic -shared -o libswap.so
g++ main.cpp -Iinclude -lswap -Lsrc -o share_main
LDLIBRARY_PATH=src./share_main
GDB:GUN Debuger ,linux下最常用的调试c/c++程序的调试器能够跟踪程序错误,常见的,诸如vscode也是通过调用GDB实现c/c++debug工作。
调试准备
g++ -g main.cpp -o test
:在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本,-g进行修改,不加-g不能用gdb调试。
gun+文件名
进入调试
l+行号
默认生成10行,当指定行号时,会生成以指定行号为中间的10行,用来查看代码,生成断点
quit
退出调试
调试过程
start
:开始运行程序,常用单步调试
r
:即run,使用后,程序自动从主函数运行到程序结束,会在断点处暂停。在使用r之前,要设置好断点。调试中再次使用r会重新开始调试。
s
:即step,使用后会逐语句的进入程序下一行,遇到函数会进入函数中执行。
n
:即next,同step类似,但next遇到函数时,不会进入函数,会返回调用,除非函数中设有断点。
c
:即continue,从当前位置连续执行,遇到下一个断点处停止
断点
b+行号
b即breakpoint,在第几行设置断点
info+b
显示断点信息,包括断点编号
d+断点编号
删除断点,断电编号不是行号,用info可查看
disable+断点编号
关闭断点,info中可显示断点状态信息,keep y为打开,keep n为关闭
enable+断点编号
打开断点
打印变量
p+变量名
输出变量值,打印地址可+&即可,注意只显示一次,打印数组同样输入数组名即可。
display+变量名
一直显示某个变量值,用于跟踪变量值,查看变化过程
info+display
查看变量编号
undisplay+变量编号
关闭常显示变量值,不加编号关闭全部
函数
bt
查看函数堆栈调用次数层级等信息,主要用于函数内部或递归调用时
finish
完成当前函数,若为一层函数,直接完成;若为递归函数,在没进入函数前使用,会直接完成递归调用,若在递归执行过程中使用,则会返回它的上一层。
until+行号
执行到某行,用于小范围跳跃。
其他
disassemble 反汇编,显示指令附近的汇编代码
shell+指令 gdb界面执行linux指令
目的:
步骤:
sudo tar -zxvf VMwareTools-X.X.X-590212.tar.gz
,版本号使用tab自动补全->cd进入 vmware-tools-distrib
文件夹sudo ./vmware-install.pl
进入若遇到Do you still want to proceed with this legacy installer?[no] ,输入yes,之后一路回车直到安装结束。若点击安装vmware tools提示:客户机操作系统已将 CD-ROM 门锁定,在上方菜单栏中进入虚拟机设置:
重新选择ubuntu的iso映像,多试几次,就能可以进入vmtools光盘映像了。
安装步骤:
sudo dpkg -i code_1.78.2-1683731010_amd64.deb
版本号用tab补全,以实际版本为主code
打开vscode插件:
若使用c/c++开发,推荐安装以下插件:
CMake(cross platform make)是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。能通过写简单的配置文件生成本地的Makefile,并且跨平台的特性十分友好,非常方便。
cmake_minimum_required(VERSION number)
指定cmake最小版本要求
project(name)
定义工程名称,还可指定工程支持的语言
add_executable(exename souucre1 soucre2...)
生成可执行文件,可包含单个或多个cpp文件
include_directories(dir)
向工程添加多个指定的头文件搜索路径
aux_source_directory(dir var)
把指定目录下所有的源文件存储在一个变量中,常用于多文件编译
调用变量时写法:${var}
,当使if时,直接加var
set(var source1 source2..)
给源文件代码定义一个变量名字,方便使用
add_compile_options()
添加编译参数,如-wall,-o,-std=c++11,中间用空格隔开。此命令还用于参与定义宏控制打印信息。
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个命令用于添加源文件子目录,同时还可以指定中间二进制和目标二进制的生成路径。外层的CMakeLists.txt使用add_subdirectory来控制其它目录下的CMakeLists.txt的运行
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
控制make命令生成的可执行文件在主目录bin文件夹下。注意使用外部构建在build中运行cmake时,bin目录的路径位置一定要写对,../bin
或 ${PROJECT_SOURCE_DIR(意为根目录)}/bin
,最好使用后者,方便别人阅读。若直接bin 会在build目录中创建一个bin文件夹。
add_library(lib_name lib_type soucre)
添加一个库,参数1为库名字,参数2位库类型动态还是静态默认静态,参数3位源文件
set(LIBRARY_OUTPUT_PATH${PROJECT_SOURCE_DIR}/lib)
设置库文件存目录为lib,代码格式
set_target_properties
: 设置最终生成的库的名称,还有其它功能,如设置库的版本号等
find_library(VAR_NAME LIB_NAME HINTS DIR)
在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,使用find能防止链接的时候才发现出错。此命令默认查动态库,若要指定查找库的类型,在第二个参数后加.so或.a
target_link_libraries (main LIB)
把目标文件与库文件进行链接,第一个参数为make生成的可执行程序,第二个为库文件,可用find生成的变量名代替
一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,库文件放到lib目录下,最终输出的可执行程序文件会放到bin目录下,这样整个结构更加清晰
编写CMakeLists:在main.cpp文件下建立CMakeLists.txt文档–>设置minimum,project,included_dir,add_executable等必要参数–>保存
外部构建:在main.cpp同级目录创建build目录–>linux终端cd进入build目录–>输入命令cmake ..
运行cmake–>生成makefile以及其它文件
生成可执行文件:在linux终端中输入make
命令–>./name执行