一.git1.常用指令1.git clone 仓库地址2.git status 查看git仓库的状态3.git add 文件 将文件传入到仓库的暂存区4.git commit -m 日志 正式的提交文件5.git push 将本地仓库的内容同步到远端6.在.gitignore中添加文件后缀可以不添加该后缀的文件7.git pull 同步远端仓库和本地仓库二.gdbgdb是Linux中常用的调试软件。只有当可执行文件为debug版本下才可以进行调试。我们正常使用gcc编译时生成的是release版本。想要变为debug需要在gcc的末尾加一个-g。命令作⽤样例list/l显⽰源代码从上次位置开始每次列出10⾏list/l 10list/l 函数名列出指定函数的源代码list/l mainlist/l ⽂件名:⾏号列出指定⽂件的源代码list/l mycmd.c:1r/run从程序开始连续执⾏runn/next单步执⾏不进⼊函数内部 逐过程 F10nexts/step单步执⾏进⼊函数内部, 逐语句 F11stepbreak/b[⽂件名:]⾏号在指定⾏号设置断点break 10break test.c:10break/b 函数名在函数开头设置断点break maininfo break/b查看当前所有断点的信息info breakfinish执⾏到当前函数返回然后停⽌finishprint/p表达式打印表达式的值print startendp 变量打印指定变量的值p xset var变量值修改变量的值set var i10continue/c从当前位置开始连续执⾏程序continuedelete/dbreakpoints删除所有断点delete breakpointsdelete/dbreakpoints n删除序号为n的断点delete breakpoints 1disable breakpoints禁⽤所有断点disable breakpointsenable breakpoints启⽤所有断点enable breakpointsinfo/i breakpoints查看当前设置的断点列表info breakpointsdisplay变量名跟踪显⽰指定变量的值每次停⽌时display xundisplay编号取消对指定编号的变量的跟踪显⽰undisplay 1until X⾏号执⾏到指定⾏号until 20backtrace/bt查看当前执⾏栈的各级函数调⽤及参数backtraceinfo/i locals查看当前栈帧的局部变量值info localsquit退出GDB调试器quitr/run运行程序遇到断点停止r三.进程1.进程的概念课本概念程序的⼀个执⾏实例正在执⾏的程序等内核观点担当分配系统资源CPU时间内存的实体。当前进程 内核数据结构(task_struct) ⾃⼰的程序代码和数据进程信息被放在⼀个叫做进程控制块的数据结构中可以理解为进程属性的集合。课本上称之为PCBprocess control blockLinux操作系统下的PCB是:task_struct在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的⼀种数据结构类型它会被装载到RAM(内存)⾥并且包含着进程的信息。2.进程相关的代码1.查看某文件的进程状态ps ajx | grep test在所有进程中搜索包含 test 的行ps ajx | head -1显示进程的第一行信息2.getpid:获得该进程的id3.getppid获得该进程父进程的id4.fork在一个进程中打开一个子进程。5../code 可以把进程在后台上运行6.echo $?获得僵尸进程的结果码7.top可以更改进程的NI值NI值的范围在[-20,19]8.exit数字在C语言中使用直接结束进程并返回进程码9.putenv(需要导入的环境变量)3.进程的运行队列以及切换调度操作系统在执行进程的时候并不是单一的执行一个单进程。大部分的电脑为多核单CPU的配置。这时为了能够执行多个进程CPU就不得不进行并行和并发。并行多个进程在多个CPU下分别同时进⾏运⾏这称之为并⾏。并发多个进程在⼀个CPU下采⽤进程切换的⽅式在⼀段时间之内让多个进程都得以推进称之为并发。那么在执行并发时操作系统是怎么去选择要进行的进程呢原因是在操作系统中有关于进程·状态的一个结构体一般来说被称为PCBtask_struct。而CPU在进行调度时有一个调度器runqueue。runqueue像一个队列一样连接着多个PCB当一个PCB执行完之后继续去排队一直连续的进行称为并发。这样的调度方法叫FIFO调度。不过这种调度方法并不能体现出PCB中的优先级所以在很早之前就被淘汰了。四.环境变量和本地变量环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪⾥但是照样可以链接成功⽣成可执⾏程序原因就是有相关环境变量帮助编译器进⾏查找。环境变量通常具有某些特殊⽤途还有在系统当中通常具有全局特性‘1.echo $NAME: 显⽰某个环境变量值2.export: 设置⼀个新的环境变量3.env: 显⽰所有环境变量4.unset: 清除环境变量5.set: 显⽰本地定义的shell变量和环境变量本地变量是shell自己设置的变量以及用户设定的变量。在命令行输入a100等指令会将该命令传入本地变量中。常见的环境变量PATH : 指定命令的搜索路径HOME : 指定⽤⼾的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)SHELL : 当前Shell,它的值通常是/bin/bash。环境变量是可以被子进程继承下去的但是本地变量不可以。1.getenv环境变量名称可以获得环境变量2.environ一个类型为char**的指针指向环境变量表的首地址environ[i]可以一次获得环境变量的值。基于这一些操作我们可以通过环境变量来让各个进程之间来同步数据。五.进程地址空间当我们使用fork去执行父子进程的时候当我们打印出一个全局变量的地址时运行代码我们可以发现他们的全局变量的地址是一样的但是当全局变量只在子进程中进行改变时。父进程中的全局变量并没有改变。但是我们之前在C语言中学到同一块区间管理的一定是一个数据。那么为什么会不一样呢这是因为在进程运行中数据所占用的地址并不是一个物理地址而是虚拟地址线性地址之前在学习C语言和C时我们会遇到这个图但是这3并不是一个程序地址。这其实是一个进程地址空间。其实在test_struct中有一个关于进程地址空间的地址指针指向这个表称为mm_struct当需要调用物理内存时通过进程地址空间来进行申请。