快速掌握Linux基本命令和操作、gcc编译器和gdb调试器的使用、makefile工程管理、main函数参数传递
本文摘要:本文系统介绍了Linux操作系统的基本命令和操作,包括文件目录结构、常用命令(ls、cd、rm等)、文件权限管理、软件安装(apt)、文本编辑(vi/vim)、进程管理(ps、kill)、用户管理(adduser)以及gcc编译器和gdb调试器的使用。重点讲解了Linux下的文件系统组织、命令操作技巧、程序编译调试流程,并涵盖了makefile工程管理和main函数参数传递等进阶内容。这
bin:(二进制执行程序)命令
boot:内核
etc:系统配置文件
home:普通用户目录
lib:库文件
usr:安装的软件(不常改变的文件)
var:数据文件(常改变的文件)
命令
(superuser do)sudo su(switch\substitute user):root管理员用户
ls:显示当前位置有那些文件
ls -l(long format)
1.文件类型与权限(-rwx r-x r-x)
-:普通文件
rwx:每三位为一组 user\group\others
ls -F 目录(mycode/)
ls -lFh (human---->M,GB,KM(方便查看文件大小))
ll ls -laF
ls -l
pwd:显示当前文件目录
cd:切换路径
. 当前位置 ..上一级 - 在最近两个位置切换 ~直接回到家目录
touch:创建普通文件
mkdir(make directory):创建目录(文件夹)
tree+目录名---->显示树状关系(sudo apt install tree)
cp:复制文件
cp 路径+源文件名 新路径+文件名 cp -r路径+源文件名 新路径+文件名
cp /ect/passwd . --->拷贝到当前位置
rm:删除文件(不可恢复) rm *--->删除此路径下 所有文件
rm 普通文件名 rm -r (remove -recursive(递归的))目录文件名
mv(move):重命名 移动、覆盖文件
mv 移动文件 目录(必须要存在)
ctrl+c----->换行
find +路径 -name (指定位置 按名字 搜索文件)
grep 在一个文件中查找匹配行(过滤)
ls l grep passwd
grep hello main.c
grep -c hello main.c --->含有其的数量
grep -v hello main.c --->取反
grep -i hello main.c --->忽略大小写
文件压缩与解压命令:
-
c 创建包文件
-
f 指定目标为文件而不是设备
-
v (reval)显示详细过程
-
t 显示包中的内容而不释放
-
x 释放包中的内容
-
z GNU版本新加的,使得tar 有压缩和解压功能
tar cvf my.tar main.c passwd tar xvf my.tar gzip my.tar //压缩包 tar zxf my.tar.gz //释放压缩包 gzip a.c gzip -d a.c.gz //-d(decompress-->解压)
|管道(进程间通信)
ls | grep "cp"
history:显示执行过的历史命令
wc** 统计 -l --->行数 -w ---->单词 -c --->字符数
关机与重启(管理员权限)
shutdown -h now 立刻关机 -h--->halt(停止、暂停)
shutdown -r now 立刻重启 -r--->reboot(重启)
halt init 0 关机
reboot init 6 重启
runlevel (运行级别)
init +等级
-
0 关机
-
1 单用户模式
-
2 多用户无网络服务
-
3 完全的多用户 文本界面
-
4 未定义或自定义
-
5 图形化界面
-
6 重启
man +命令/函数 帮助手册
-
命令---->1
-
系统调用 ---->2
-
库函数----->3
权限
r ---> 4,w ---> 2,x(执行) ----> 1 chmod(切换权限)
文件类型
-普通(归档)文件
d目录文件
p(pipe) 管道文件
c,b(block)设备文件(字符、块)
l 链接文件
s 套接字
安装软件
管理执行 apt install 软件名 apt(Advanced Package Tool)高级软件包工具
sudo su 切换到管理员
apt install vim
apt install gcc
apt install g++
apt install make
apt install gdb
apt install net-tool
vi/vim---->文本编辑器(Visual Interface(可视化接口))
cat(Concatenate-->串联、连接)打印,合并
cat a.txt 打印文件内容-->屏幕
cat main.c test.c > file.txt ---->合并 > 重定向 到新文件
cat > a.txt --->写入--->ctr+d(结束)
more--->分屏幕打印显示(一次机会)
less ---->浏览文件内容 退出q
tail----->查看文件末尾 默认10行
head ---->查看文件的起始 默认10行
-
命令模式
-
i,a,o--->(命令模式--->插入模式) ESC---->(插入模式---->命令模式) : ? /----->(命令模式----->末行模式)
-
nyy 拷贝n行
-
p 粘贴
-
ndd 删除/剪切
-
u 撤销一次操作
-
ctr+r 恢复上一次操作
-
G 跳转到最后一行
-
gg 跳转到第一行
-
/ 搜索
-
-
插入模式
-
I 行头
-
A 行尾
-
O 整行前
-
i 光标前
-
a 光标后
-
-
末行模式
-
:wq 保存并退出
-
:w 只保存
-
:q 只退出
-
:q! 不保存退出
-
:set nu ---->显示行数
-
:n 跳转到第n行
-
:/+str ===>搜索当前文件字符串
-
:set hlsearch 搜素结果高亮
-
Linux不以文件后缀名区分文件类型
main.c c语言编译器要求源代码必须.c 结尾
进程有关的命令
ps(Process Status):进程状态 ps -e(系统进程) ps -ef(系统和自己进程) ps -ef | grep sleep---->查找
-
操作系统管理进程 父进程 子进程(相对的)
-
pid 进程的id号 --->int
-
进程控制块(PCB(进程描述符)) --->结构体 struct task_struct;
-
结束这个进程 kill +pid ctr+c 结束当前终端在前台运行的程序
-
前台 sleep 200 ctr+z暂停运行 bg %任务号---->前台转后台 kill -9 pid--------->强制结束
-
后台 sleep 200&---->+&---->后台运行 显示任务号 ---->jobs 显示任务号和pid---->jobs -l
-
结束-->后台运行:&
sleep 400 ctr+Z //停止进程 jobs -l //显示任务 bg %任务号 //切换后台工作 fg %任务号 //切换前台工作 kill -9 pid/kill+pid/ctr+c(已切换到前台) //强制杀死进程 //若停止后想杀死进程必须 kill -9 pid
-
pkill +程序名字---->结束该名字对应的所有进程
ctr+l---->清屏
用户管理命令
-
etc/passwd 存储用户基本信息
-
etc/group 存储用户组信息
-
etc/shadow 存储用户的密码
管理员
-
adduser 添加新用户
-
passwd+用户名 修改用户密码
-
deluser -r +用户名 删除用户
-
top(资源管理器) exit---->退出
gcc
Linux系统可执行程序的格式 ELF
Window系统可执行程序格式 PE
main.c
main.exe/main 可执行程序
面试常问重点:
预编译(-E)
gcc -E mian.c (-o main.i)
-
删除所有“define”,并展开所有的宏定义;
-
处理所有条件预编译指令,“if”、“endid”、“#endif”等;
-
处理“#include”预编译指令,将其插入到该预编译指令位置
-
删除所有注释
-
添加行号和文件名的标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
-
保留所有的#grama编译器指令,因为编译器需要使用它们
编译 (-S) 转换为汇编代码
-
词法分析、语法分析、语义分析、代码优化、代码优化、汇总符号
gcc -S main.i (-o main.s)
汇编 (-C)
-
将汇编指令翻译成二进制格式,生成各个section,生成符号表
gcc -c main.s( -o main.o)
链接(-O):形成可执行文件
gcc -o main main.o
gcc main.o -o main
链接多个文件
gcc -o main main.c a.c
运行:./main
-
合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析, 给符号分配虚拟地址
-
符号重定位
makefile和make
管理工程 实现自动化编译 (和vs比较)示例: 对 main.c add.c max.c 三个文件进行编译(注意: gcc前面必须是table建缩进) 
all------->伪目标(默认目标)
main------>最终的可执行文件
clean------->自定义清理目标(中间文件和可执行文件)
rm -r((recursive)递归删除) f(force)---->强制 *.o(通配符)---->所有.o结尾的目标文件


拓展:cmake
GDB
Debug和Release版本:
Debage
-
可调式版本(生成的可执行文件中包含调试索需要的信息)
Release
-
发行版本(用户使用的版本gcc默认生成)
单线程、单进程

.PHONY:main------->伪目标(不进行目标文件和依赖文件de时间戳的比较)
gcc -o main main.c -g(增加调试信息)
gdb main---->调试的一定是可执行程序
l (list)---->显示代码 l 文件名.c:1(第一行)
b(break)+行号/函数名----->断点
info break ----->显示断点信息
delet+断点号------->删除断点
r(run)-------->运行
n(next)------>单步运行
p(print)---->打印
c(continue)---->继续执行,直到下一个断点
s(step)------>进入函数
finish---->跳出函数
bt(backtrace)----->显示函数调用的栈关系
主函数main()传参
主函数传参:接收外部输入,实现“灵活配置运行逻辑”,无需修改代码就能改变程序运行逻辑
实现与外部的交互;
#include<stdio.h>
int main(int argc,char* argv[],char* envp[])//argv--->参数内容 envp--->坏境变量
{
int i;
for(i=0;i<agrc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;envp[i]!=NULL;i++)//环境变量envp天然以NULL结尾
{
printf("envp[%d]=%s\n",i,envp[i]);//环境变量的名字==值
}
}
更多推荐


所有评论(0)