赞
踩
必须安装的东西:
sudo yum install -y man-pages
sudo yum install -y epel-release
这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件,安装完毕之后可以通过拖拽的方式将文件上传过去
sudo yum install lrzsz
当然了,也可以直接输入指令来上传 rz -E
接收:云服务可接受本地及其上传的指定文件
sz 文件名
发送:可将云服务器上的文件发送到本地机器的指定位置
1.关于 yum 的所有操作必须保证主机(虚拟机)网络畅通 2.centor里面,只能有一个yum在运行,即一次只能安装一个软件
可以通过 ping 指令验证
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yq6VMi6a-1675492841935)(https://mangoimage.oss-cn-guangzhou.aliyuncs.com/ping%E6%8C%87%E4%BB%A4.png)]
sudo yum list
默认列出所有的软件, 但是数目有很多,我们可以使用管道| 和 行过滤指令grep
进行过滤搜索
以sl小火车为例:sudo yum list | grep sl
例子:
yum list | grep lrzsz
通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装. sudo yum install lrzsz
yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装->出现 “complete” 字样, 说明安装完成
例子:
sudo yum remove 软件名
例子:
sudo yum remove lrzsz
加上-y 选项 -> 不询问直接安装/卸载
sudo yum install -y sl
执行: sl
参数:
sudo yum install -y cowsay
执行: cowsay 字符串
sudo yum install -y boxes
执行: echo “要显示的内容” |boxes -d dog
或者: echo “要显示内容” |boxes -d cat
sudo yum install -y linux_logo
执行:linux_logo
参数:
-a 取消颜色输出
-L +数字 后面跟着数字,输入不同系统的logo
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows.
主要了解vim的三种模式: 命令模式(command mode)插入模式(Insert mode)和底行模式(last line mode)
在底行模式中输入:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4Z0C6MD-1675492841943)(https://mangoimage.oss-cn-guangzhou.aliyuncs.com/%E6%9F%A5%E7%9C%8Bvim%E7%9A%84%E6%A8%A1%E5%BC%8F.png)]
可以查看到vim的模式有什么:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oh95vtKT-1675492841944)(https://mangoimage.oss-cn-guangzhou.aliyuncs.com/vim%E7%9A%84%E6%A8%A1%E5%BC%8F.png)]
进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面
例如:
vim test.c
vim后面跟的文件名,如果该文件不存在,则会自动创建文件然后打开, 如果存在,则直接打开 注意:进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字.
esc键
「yw」:将光标所在之处到字尾的字符复制到缓冲区中.
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区.
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字.
「p」:将缓冲区内的字符贴到光标所在位置.
np:一次重复粘贴n行
注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能.
先yy,然后直接np:在光标位置往后复制n行
dd之后再p :剪切
在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式
如何左右分屏:
在底行模式下,
vs 文件名
可以不断分屏,往左侧分屏,如果vs后面的文件名不存在,则会默认先创建,再打开
如何快速切换屏幕:
在底行模式下 按ctrl +w +w
, 光标在哪里闪动,就说明哪个文件被选中,在该文件底行模式输入wq保存退出,保留的就是另外的文件
主要使用三种模式:底行模式,命令模式,插入模式 vim操作:打开,关闭,查看,查询,插入,删除,替换,撤销,复制
a i o都能进入插入模式
验证:
底行和插入不能直接跳转!!!
批量化注释:
ctrl + v
然后用l,j,k,h
选中区域,然后按大写的I
,会跳到第一个位置,输入//
注释,然后按esc按键
批量化去注释:
ctrl + v
然后用l,j,k,h
选中区域,注意:要选中两个//
然后按小写的i
,然后按d
在底行模式下: :%s/你要替换的内容/替换成什么
:%s/你要替换的内容xxx/替换成yyy/g
才是将xxx全部替换为yyy 如果用上面的可能xxx.cc 不会替换为yyy.cc如何不退出vim查看手册?
在底行模式下: !man 查询内容
按q退出,回到vim当中 例子: !man fork
用户在配置vim的配置文件中,只会影响自己(用户)的操作, root有自己的vim配置文件,也只会影响自己(root)
su
,进入自己的主工作目录,执行 cd ~
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLNI87Tz-1675492841950)(https://mangoimage.oss-cn-guangzhou.aliyuncs.com/.vimrc.png)]
注意:要在自己的工作目录(~)下创建.vimrc文件,最基本的vim的配置都写在.vimrc文件中,想要配置vim,只需要在.vimrc文件中添加内容即可
只需在.vimrc文件中写入对应的内容即可:
自动配置vim:
直接输入如下命令
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
然后按照提示输入root密码,然后等待安装配置,最后手动执行source ~/.bashrc.配置完成后,类似自动补全、行号显示以及自动缩进等功能就有了
vim /etc/suduers
gcc和g++分别是GNU的C和C++的编译器,gcc和g++在执行编译的时候一般有以下四个步骤:
1)预处理(头文件展开、去注释、宏替换、条件编译)
2)编译(C代码翻译成汇编语言)
3)汇编(汇编代码转为二进制目标代码,生成机器可识别代码)
4)链接(将汇编过程产生的二进制代码进行链接,生成可执行文件或库文件)
格式 gcc/g++ [选项] 要编译的文件 [选项] [目标文件]
gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -c test.s -o test.o
gcc test.o -o test
注意:链接后生成的也是二进制文件
如果想直接生成可执行程序:
gcc test.c -o test
或者: gcc -o mytest mytest.c
也行 ,生成名字为mytest的可执行程序
上面涉及到一个重要的概念:函数库
函数库一般分为静态库和动态库两种: windows下:静态库后缀名一般为.lib
动态库后缀名一般为:.dll
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了.静态库后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销.动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库.gcc 在编译时默认使用动态库完成了链接之后,gcc 就可以生成可执行文件.
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证.
gcc/g++默认采用动态链接,如果想要使用静态链接 -> 带上**-static**选项
动态链接:
优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快. 缺点:依赖动态库,程序可移植性较差.
静态链接:
优点:不依赖第三方库,程序的可移植性较高. 缺点:浪费空间.
验证:
静态链接的文件大小>动态链接的文件的大小 , 这也证明了动态链接节省空间,而静态链接比较浪费空间
注:如果上面的内容报错了,就需要安装静态库 g++ 和gcc的选项、动静态库链接没有任何差别,可能需要下载静态库libc.a
安装C静态库 & C++静态库指令如下:
sudo yum install glibc-static sudo yum install libstdc++-static
gdb后面跟可执行程序的名字
Centos中,默认生成的二级制程序是release版本的,没有调试信息
对同一份代码分别生成其release版本和debug版本的可执行程序,可以看到,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大,其原因就是以debug版本发布的可执行程序当中包含了调试信息
我们先编写一段代码:
退出gdb调试: ctrl + d 或 quit
关于显示代码:
关于断点
break 函数名:在某个函数开头设置断点
这个断点默认打在了函数的第一条代码处
程序运行时的操作:
finish vs continue vs until
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
在使用make/Makefile前我们首先应该理解各个文件之间的依赖关系以及它们之间的依赖方法
依赖关系: 文件A的变更会影响到文件B,那么就称文件B依赖于文件A
依赖方法: 如果文件B依赖于文件A,那么通过文件A得到文件B的方法,就是文件B依赖于文件A的依赖方法
我们可以直接使用gcc指令对多个源文件进行编译,进而生成可执行程序
但进行多文件编译的时候一般不使用源文件直接生成可执行程序,而是先用每个源文件各自生成自己的二进制文件,然后再将这些二进制文件通过链接生成可执行程序
但是问题来了:如果源文件有很多,我们每次重新生成可执行程序时,所需输入的gcc指令的长度与个数也会随之增加这时我们就需要使用make和Makefile了,这将大大减少我们的工作量
可以简写成:
@ 表示依赖关系中的目标文件 ∗ ∗ ∗ ∗ @ 表示依赖关系中的目标文件** ** @表示依赖关系中的目标文件∗∗∗∗^ 表示依赖关系中的依赖文件列表 $< 表示依赖关系中的第一个依赖文件
注意:gcc/g++携带-c选项时,若不指定输出文件的文件名,则默认输出文件名为xxx.o,所以这里也可以不用指定输出文件名.
我们首先创建一个普通文件Makefile
或者makefile
,里面写我们的依赖关系和依赖方法
.PHONY:
修饰对应符号,让符号变成伪目标(伪目标:总是可以执行的)也确实观察到如果没有对文件进行修改,执行make命令是没有效果的(底层是通过对比修改时间和可执行时间实现的),然而make clean 即便刚刚执行过,也可以随便执行
mytest的生成依赖mytest.c ,前者依赖后者
如果多次执行编译:
编译一个源文件到可执行程序,如果再次编译,当系统检测到源文件没有做任何修改,不用重新编译,所以这就是只有第一次执行,不具备总是被执行的特点
写法:
目标文件:依赖文件
依赖方法
注意:上面的也可以写成这样:
$@
:目标文件 $^
:文件列表make:相当于VS中的生成解决方案 make clean :相当于VS中的清理解决方案
例子2:
make是如何工作的,在默认的方式下,也就是我们只输入make命令之后发生了什么?
make会根据你编写的依赖关系,自动推导程序的执行
make会在当前目录下找名字叫Makefile或makefile的文件 然后它会默认找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件
在如下代码中,mytest
所依赖的mytest.o
不存在或是被修改,就会执行对应的依赖方法,mytest的依赖关系中mytest.o
又不存在,那么make会在Makefile文件中寻找目标为test.o
文件的依赖关系,如果找到则再根据其依赖方法生成test.o
文件,以此类推.(类似于堆栈的过程),总之,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件.
注意:make执行的指令和makefile中的顺序有关!make扫描makefile文件的时候,默认只会形成一个目标依赖关系,一般是第一个
make默认执行的是第一个
首先明确两个概念
\r
:回到当前行的最开始 换行\n
:列不变,新起一行键盘上的Enter键实际上就等价于\n+\r
\r是使光标回到本行行首,那么如果我们向显示器上写了一个数之后再让光标回到本行行首,然后再写一个数,就相当于将前面一个数字覆盖,
问:不使用’\n’进行换行怎么将缓冲区当中数据进行打印
使用fflush函数,刷新缓冲区,即将缓冲区当中的数据刷新当显示器当中.
效果:
在Linux下对下述两个代码的执行结果分析:
#include <stdio.h>
int main()
{
printf("hello makefile\n");
sleep(3);
return 0;
}
执行结果:先打印,然后休眠3s,然后程序结束
#include <stdio.h>
#include <unistd.h> //为了使用sleep函数
int main()
{
printf("hello makefile");
sleep(3);
return 0;
}
此时发现:是先休眠3s,然后打印 ,
而它与上面代码的区别,仅仅只是打印时是否带了\n
问题: 这意味着sleep休眠先于printf执行吗?绝对不是!
解释:只是printf不带\n
在向显示器打印时,数据不会立即刷新,而是会暂时保存在用户C语言级别的缓冲区中(文件系统详谈),显示器的刷新策略就是行刷新,即\n
即进行刷新.带了\n会把我们的数据立即刷新出来
解决办法: 如果我们不想换行,又想刷新,可以调用库函数fflush,进行刷新显示
fflush(stdout)
#include<stdio.h>
int main()
{
printf("hello makefile");
fflush(stdout);
sleep(3);
return 0;
}
此时我们看到的结果就是先打印,然后再休眠3s
【百度笔试题】进度条: 不进行换行,从左至右依次变长
makefile
文件,这样直接make就可以直接生成可执行程序了proc:proc.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -rf proc
代码:
#include<stdio.h>
#include<string.h> //使用memset函数
#include<unistd.h> //使用usleep函数
#define NUM 100 //进度是100
int main()
{
char bar[NUM+1];//多开一个空间放\0
memset(bar,0,sizeof(bar));//初始化为0
int i = 0;
const char* label = "|/-\\" //用于旋转,表示程序正在运行
while(i<=100)
{
printf("[%-100s][%3d%%][%c]\r",bar,i,label[i%4]);
fflush(stdout);//因为没有带\n,所以要及时刷新缓冲区
usleep(50000);//休眠一段时间
bar[i] ='='
i++;
}
printf("\n");
reutrn 0;
}
usleep
,需要引用头文件:#include<unistd.h>
单位是微秒\0
[%-100s]
打印进度条,这样就预留了100个字符的空间,并且是从左向右输出,即左对齐
label
旋转光标,表示当前进度条处于工作状态,每个字符都要轮流变化,所以下标变化为: i%4\
为特殊字符需要转义 \\
代表的就是\%%
代表的就是%[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUXw6CxV-1675492842007)(https://mangoimage.oss-cn-guangzhou.aliyuncs.com/%E8%BF%9B%E5%BA%A6%E6%9D%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.gif)]
安装yum install git
, 先创建仓库,然后找到仓库的链接:
在Linux下把仓库加入进去: git clone url
其中url就是上面箭头指的仓库的链接
把代码放到仓库中, git add 文件名
将需要用 git 管理的文件告知 git
git commit -m "日志信息"
.
表示当前目录 提交的时候应该注明提交日志, 描述改动的详细内容.同步到远端服务器上,需要填入用户名密码. 同步成功后, 刷新 gitee页面就能看到代码改动了
如果中途出现下述情况:
根据它的提示输入即可:
git config --global user.email "xx"
git config --global user.name "xx"
git本地免密码和账号pull、push_CamilleZJ的博客-CSDN博客
其它指令:
git status
查看目前状态 git log
查看日志信息
注意:在Linux下要编写编程语言:
c语言的后缀: .c
gcc test.c -o test -std=c99
C++的后缀: .cc
python的后缀: .py
需要在第一行选择版本:#!/usr/bin/python3
如何执行?
python test.py
Shell脚本的后缀: .sh
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。