一.快捷键
# ctrl+a 移动至开头
# ctrl+e 移动至结尾
# ctrl+u 删除光标之前内容
# ctrl+l 清屏
二. 常用命令总结(Ubuntu)
# 1.查看当前系统网络情况
ifconfig
# 2.查看端口占用情况
netstat -nplt
# 3.查看防火墙状态
ufw status
# 4.查看当前目录大学
du -h
# 5.查看磁盘使用情况
df -h
# 6.查看内存使用情况
free -m
# 7.修改文件权限
# 文字设定法:
# 1) who:文件所有者(u)、文件所属组(g)、其他人(o)、所有人(a)
# 2) +:增加权限、-:减少权限、=:覆盖原来权限
# 3) mode:读(r)、写(w)、执行(x)
chmod [who] [+|-|=] [mode] 文件名
# 数字设定法:
# 1) r:读权限(4)
# 2) w:写权限(2)
# 3) x:执行权限(1)
chmod 777 【文件名】
# 8.改变文件或目录的所有者或所属者
chown 【所有者】【文件】
chown 【所有者:所属组】【文件】
# 9.查找和检索
# 按文件属性查找:
# 1)文件名:
find + 查找的目录 + -name +“文件的名字”
# 2)文件大小:
find + 查找的目录 + -size + 文件的大小
# 3)文件类型:
find + 查找的目录 + -type + d(目录)/f(普通文件)/b(块设备)/c(字符设备)/s(套接字)/p(管道)/l(链接符号)
# 按文件内容查找:
grep -r “查找内容”+查找路径
# 10.软件的安装和卸载
# 在线安装:
# 1)安装:
sudo apt-get install xxx
# 2)卸载:
sudo apt-get remove xxx
# 3)更新:(升级所有包同时也升级软件和系统内核。更新软件列表。)
sudo apt-get update
# 4)清空:(情况安装包缓存,实际清理的是:/var/cache/apt/archives目录下的.deb文件)
sudo apt-get clean
# deb包安装:
# 1)安装:
sudo dpkg -i deb包
# 2)卸载:
sudo dpkg -r 卸载包
# 源码安装:
# 1) 解压缩源代码包
# 2) 进入到安装目录:cd dir
# 3) 检测文件是否缺失,创建Makefile,检测编译环境:./configure
# 4) 编译源代码,生成库和可执行程序make
# 5) 把库和可执行程序,安装到系统目录下:sudo make install
# 6) 删除和卸载软件:sudo make distclean
# 7) 上述安装步骤并不绝对,应该查看附带的README文件,会有详细说明。
# 11.挂载U盘
# 挂载(mount命令):
# 1)系统默认挂载目录:/media
# 2)手动挂载目录:/mnt,可用sudo fdisk -l查看设备信息
sudo mount 【设备名】【/mnt】
# 卸载(umount命令):(注意:不能在要卸载的目录中)
sudo umount 【卸载路径】
# 12.压缩包管理
# 1)gzip: .gz格式的压缩包,不会打包压缩也不会保留原文件
# 压缩
gzip 【文件名】
# 解压缩
gunzip【文件名】
# 2)bzip2: .bz2格式的压缩包,不能压缩目录,只能压缩文件
# 压缩
bzip2 【文件名】
# 解压缩
bunzip2【文件名】
# 3)tar:
# 参数:
# a) c -- 创建
# b) x -- 释放(与c互斥,不能一起用)
# c) v -- 显示提示信息 -- 压缩解压缩时可以省略
# d) f -- 指定压缩文件名字(压缩解压缩时都要使用)
# e) z -- 使用gzip方式压缩文件 -- .gz
# f) j -- 使用bzip2方式压缩文件 -- .bz2
# 压缩:
tar zcvf 【生成的压缩包的名字(xxx.tar.gz)】【要压缩的文件或目录】
tar jcvf 【生成的压缩包的名字(xxx.tar.bz2)】【要压缩的文件或目录】
# 解压缩
tar zxvf 【压缩包的名字】(解压到当前目录)/tar zxvf 【压缩包的名字】-C 【路径】(压缩到指定路径)
tar jxvf 【压缩包的名字】(解压到当前目录)/tar jxvf 【压缩包的名字】-C 【路径】(压缩到指定路径)
# 4)rar: (必须手动安装该软件)
# 参数:
# a) 压缩:a
# b) 解压缩:x
# 压缩:
rar a 【生成的压缩文件的名字(无需指定后缀,会自动生成)】【要压缩的文件或目录】
# 解压缩:
rar x 【压缩文件名】/rar x 【压缩文件名】【指定路径】
# 5)zip:
# 参数:压缩目录需要加递归参数 -r / 解压缩到指定路径要加-d
# 压缩
zip 【生成的压缩包名字】【压缩到的文件或目录】
# 解压缩
unzip 【压缩包的名字】/unzip 【压缩包的名字】 -d 【解压缩到指定路径】
# 13.进程管理
# 1)查看整个系统内部运行的进程状况
# 参数:一般使用aux,三个可以一起连用
# a) a(查看所有用户信息)
# b) u(用户的信息)可与a连用:ps au
# c) x(查看没有终端的应用程序)ps aux,终端的作用是与用户进行交互。
ps aux | grep xxx(查找进程里的xxx进程,ps aux是查看所有进程信息,grep是查找这些进程中有没有xxx进程)
# 2)杀死进程
kill -9 【进程PID】
# 3)查看当前进程的环境变量:(所有环境变量设置)
env
# 4)任务管理器
top
# 14.用户管理
# 1)创建用户
# 方法一(是一个脚本)
sudo adduser 【用户名(不能包含大写字母)】
# 方法二
1) -s指定新用户登录时shell类型
2) -g指定所属组,该组必须已经存在
3) -d用户家目录
4) -m用户家目录不存在时自动创建该目录
5) 如果组不存在,则sudo groupadd 【组名】
sudo useradd -s 【/bin/bash】 -g 【xxx】-d 【/home/xxx】 -m 【xxx】
# 2)删除用户
# 方法一(手动删除家目录)
sudo deluser 【用户名】
# 方法二(-r的作用是把用户的主目录一起删除)
sudo userdel -r 【用户名】
# 3)切换用户
su 【用户】
# 4)设置密码
sudo passwd 【用户】
# 15.其他
# 1)创建终端
ctrl + alt + t
# 2)更改tty
ctrl + alt + F1~7
# 3)查看别名
alias
# 4)关机
poweroff
# 5)重启
reboot
三 Vim使用

## 命令模式下的操作
# 1.光标移动
0(行首)、$(行尾)、gg(文本首)、shift+G(文本尾),N+G(跳到N行)
# 2.删除操作
x(删除光标上的字符(也就是光标后的))、shift+x(X删除光标前的字符)、d0(从光标往前删到行首)、d$(删除光标以后的部分)、dd(删除整行)、4dd(删除从光标开始数四行)
# 3.撤销操作
u(撤销)、Ctrl+r(反撤销)
# 4.复制粘贴操作
p(粘贴,粘贴至光标所在行的下一行)、shift+p(粘贴至光标所在行)、yy(复制光标所在行)、Nyy(复制N行)
# 5.可视模式
v(切换为可视模式)复制(y)或者删除(d)
# 6.查找操作
/【要查找的单词】 (输入n可在查找高亮目标进行切换)
# 7.缩减
向右>>,向左<<
## 文本(编辑)模式下的操作
i:插入字符到光标前面
## 末行模式下的操作
# 1.替换:
1) 先将光标移动到要替换的单词那一行
2) 输入:切换至末行模式,输入s/【要替换的内容】/【替换成的内容】
3) 若要替换当前行所有的这个内容,需输入s/【要替换的内容】/【替换成的内容】/g
4) %s/【要替换的内容】/【替换成的内容】:替换文本中每一行第一个该内容
5) s/【要替换的内容】/【替换成的内容】/g:替换文本中所有该内容
6) 27,30s/【要替换的内容】/【替换成的内容】/g:替换27到30行
# 2.保存退出
wq
## 分屏操作
1)水平分屏:末行模式下输入sp,Ctrl+w+w可以上下切换屏幕操作,wqall全部退出,不加all在哪个文件操作哪个
2)垂直分屏:末行模式下输入vsp,Ctrl+w+w可以在两个屏幕之间切换,vsp 【当前目录下文件名字】即可用一个分屏操作另一个文件。
四 gcc使用

# 1.直接由C文件生成exe文件'
gcc hello.c -o myapp
# 2.gcc的一些参数使用
i. -E:预处理(.i文件)
ii. -S:C转汇编(例如gcc -S hello.i -o hello.s,其他同理)(.s文件)
iii. -c:汇编转二进制(.o文件)
iv. -o:生成文件
v. -I:gcc hello.c -I 【头文件路径】-o app(要么头文件与C文件在同一目录下,要么指定头文件目录)
vi. -D:gcc hello.c -I 【头文件路径】-o app -D 【宏】(编译时定义宏)
vii. -O:优化(0、1、3三个等级优化,可以优化冗余代码,例如-O0没有优化、-O1缺省值、-O3优化级别最高)
viii. -Wall:输出警告信息
ix. -g:添加调试信息(文件会变大)(gdb调试的时候必须加此参数)
五 静态库
# 1.命名规则
lib + 库的名字 + .a(所有静态库都是.a结尾),例如libmytest.a(库的名字就是mytest)
# 2.制作步骤
i. 生成对应的.o文件(xxx.c---->xxx.o,只需要-c即可转换):gcc -c *.c
ii. 将生成的.o文件打包(打包工具ar)ar rcs 【静态库的名字】【生成的所有的.o文件】
iii. -L(指定库的目录),-l(指定库的名字mytest,掐头去尾)
iv. nm 【libmytest.a】查看库的内容
# 3.优缺点
i. 优点:
1) 发布程序的时候不需要提供对应的库
2) 加载库的速度快
ii. 缺点:
1) 库被打包到应用程序中导致库的体积很大
2) 库发生了改变,需要重新编译
示例

- 编写需要生成静态库的程序
- head.h
#ifndef __HEAD_H
#define __HEAD_H
int add(int num1,int num2);
int sub(int num1,int num2);
int mul(int num1,int num2);
int div(int num1,int num2);
#endif
- add.c,sub.c,mul.c,div.c
#include "head.h"
int add(int num1,int num2){
return num1 + num2;
}
#include "head.h"
int sub(int num1,int num2){
return num1 - num2;
}
#include "head.h"
int mul(int num1,int num2){
return num1 * num2;
}
#include "head.h"
int div(int num1,int num2){
return num1 / num2;
}
- 生成对应的.o文件
gcc -c *.c -I ../include
- 将生成的.o文件打包
ar rcs libMyCalc.a *.o
mv libMyCalc.a ../lib/ # 移动到lib目录
- 编写文件使用静态库 main.c
#include <stdio.h>
#include "head.h"
int main(void){
int addResult = add(10,20);
int subResult = sub(10,20);
int mulResult = mul(10,20);
int divResult = div(10,20);
printf("add: %d\n",addResult);
printf("sub: %d\n",subResult);
printf("mul: %d\n",mulResult);
printf("div: %d\n",divResult);
return 0;
}
- 生成可执行程序
gcc main.c -I include/ -L lib/ -l MyCalc -o app
- 查看库内容
nm lib/libMyCalc.a
六 动态库
# 1.命名规则
lib+名字+.so
# 2.制作步骤:
i. 生成与位置无关的代码(生成与位置无关的.o(静态库是与位置有关的.o))
gcc -fPIC -c *.c
ii. 将.o打包成共享库(动态库)(这里不是使用ar打包):
gcc -shared -o 【生成的共享库名字libmytest.so】 *.o
iii. 使用:
1) 第一种:gcc main.c libmytest.so -o app
2) 第二种:gcc main.c -L【库的路径】 -l mytest -o app
# 3.解决程序执行时动态库无法被加载的问题
ldd myapp (查看执行文件的动态链接库)
1) 粗暴设置:将库复制粘贴到lib目录即可使用动态链接器(PATH环境变量),
sudo cp lib/libmytest.so /lib
2) 临时设置:可以将动态库路径指定到环境变量:LD_LIBRARY_PATH(临时的,关掉就没有了,开发过程中测试场景)
a) echo $LD_LIBRARY_PATH(发现没有值)
b) 赋值:$LD_LIBRARY_PATH=【动态库路径】
c) export $LD_LIBRARY_PATH(将设置的值导入到系统环境变量中)
3) 永久设置(不推荐):
a) 在家目录下,ls -a找到.bashrc(配置文件,重启终端生效)
b) vi .bashrc
c) G将光标移动到最后一行,将export LD_LIBRARY_PATH=【绝对路径】写在在最后一行即可永久操作动态库。
4) 第四种设置方法:
a) 需要找到动态链接器的配置文件————ls -l ld.so.conf(/etc目录下)
b) 动态库的路径写到配置文件中————sudo vi ld.so.conf
c) o添加一行(将动态库绝对路径写上即可),wq
d) 更新————sudo ldconfig -v(-v信息输出,tar zxvf中有)
e) ldd发现链接好了
# 4.优缺点:
i. 优点:
1) 执行程序体积小
2) 动态库更新不需要重新编译(前提是接口不变,内容可以变)
ii. 缺点:
1) 需要把动态库提供给用户
2) 没有被打包到应用程序中,相对静态库较慢
示例
-
编写使用动态库的程序文件(延续使用静态库的案例)
-
生成对应与位置无关的.o文件
gcc -fPIC -c *.c -I ../include/
- 将.o打包成共享库
gcc -shared -o libMyCalc.so *.o
mv libMyCalc.so ../lib/ # 移动到lib目录
- 生成可执行文件
gcc main.c lib/libMyCalc.so -o app -I include/
# 或者使用下面命令,需解决程序执行时动态库无法被加载的问题
gcc main.c -I include/ -L lib -l MyCalc -o app
七 gdb调试
gdb调试:gcc *.c -o app -g(-g的作用是输出调试信息)
a. 启动gdb:gdb 【应用程序名字】
b. 查看代码:l (默认打开包含main的文件)、l 【文件名】:20(打开其他代码文件的第20行代码)、l【文件名】:【函数名】(再按l继续查看下面的内容)
c. 设置断点:break 7(在第七行打断点)break也可简写为b
i. 设置当前文件断点:break b
ii. 设置指定文件断点:b 【文件名】:行号/【函数名】
iii. 设置条件断点:b 15 if i==15(如果i==15则停)
iv. 删除断点:
1) info break(查看断点信息,找到要删除的断点编号)
2) d 【编号】
d. 查看设置的断点:i b (info break)查看断点信息
e. 开始执行gdb调试:
i. 执行一步操作:start (只执行一步)
ii. 继续执行:n(单步执行、跳过函数体)、c(继续执行,知道停在断点位置)、s(单步、可进入函数体内部)
iii. 执行多步,最直接停在断点处:run或者r
f. 单步调试
i. 进入函数体内部:s
ii. 从函数体内部跳出:finish
iii. 不进入函数体内部:n
iv. 退出当前循环:u(跳出单次循环)
g. 查看变量的值:p 【要查看的值】
h. 查看变量的类型:ptype 【要查看的变量】
i. 设置变量的值:set var i=10
j. 设置追踪变量:display 【要追踪的变量】
k. 取消追踪变量:
i. info dispaly(第一步要先查看设置的追踪变量的编号)
ii. undisplay 【追踪变量的编号】
l. 退出gdb调试:quit
八 Makefile

- makefile1
# 第一种方法修改后,修改任一.c文件都需要将整个重新编译
app:main.c add.c sub.c mul.c div.c
gcc main.c add.c sub.c mul.c div.c -o app
- makefile2
# 第二种方法修改后,依据依赖和目标的生成时间不同可以实现按需编译
app:main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
mul.o:mul.c
gcc -c mul.c
div.o:div.c
gcc -c div.c
- makefile3
# 第三种方法
# makefile中的变量:
i. 普通变量:
1) 变量取值:foo=$(obj)
2) makefile中自己维护的变量:(大写的都是makefile库中自己维护的变量,部分有默认值,用户都可以自己设定默认值)
a) CC : 默认值为cc
b) CPPFLAGS 预编译工程中的参数选项,可以自己设定默认值
c) 还有如下变量:
i.CPPFLAGS 预处理器需要的选项,如-I
ii.CFLAGS 编译的时候使用的参数,如-Wall -g -c
iii.LDFLAGS 链接库使用的选项,如-L -l
d) 用户可以自己设定默认值CC=gcc
ii. 自动变量:
1) 变量:
a) $<:规则中的第一个依赖
b) $@:规则中的目标
c) $^:规则中的所有依赖
d) 都必须在规则中的命令使用
2) 横式规则:
a) 在规则的目标定义中使用%
b) 在规则的依赖条件中使用%
obj=main.o add.o sub.o mul.o div.o
target=app
$(target):$(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@
- makefile4
# makefile中函数的使用
i. src=$(wildcard 【指定目录】/*.c) — — — — 函数wildcard:在指定目录下查找所有.c文件
ii. obj=$(patsubst【指定目录】/%.c,【指定目录】/%.o,$(src)) — — — — 匹配替换,将src找到的.c文件替换为.o文件
target=app
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
CC=gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
clean:
-mkdir /aa #(- 表示程序出错忽略,继续执行)
rm -rf $(obj) $(target)
hello:
echo "Hello Makefile"
网友评论