ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu Linux基础

Ubuntu Linux基础 一、目录结构1. 根目录与系统目录根目录为 /核心子目录包括bin命令二进制文件、boot启动文件、etc系统配置文件、home普通用户家目录、root管理员家目录、lib库文件、usr用户应用等。2. 用户家目录规则用户名示例stu、xiaowang。对应家目录/home/stu、/home/xiaowang家目录下可创建 C 语言开发文件/目录如 main.c、mycode 文件夹。特殊路径符号.当前目录、..上一级目录、~家目录。3. 路径类型绝对路径如 /home/stu/main.c从根目录开始的完整路径。相对路径基于当前位置的路径如 cd mycode、cd ..。二、文件类型Windows 后缀区分.txt、.jpg、.exe 等Linux 符号区分-普通文件、d目录文件、p管道、l链接文件、c/b设备文件、s套接字文件三、修改权限1.权限基础逻辑权限维度r读数字值4、w写数字值2、x执行数字值1、-无权限数字值0。归属维度u文件所有者、g所属组、o其他用户。2.权限表示方法符号法如 rw-r--r--所有者读/写组/其他仅读。数字法将归属维度的权限值相加如 764u:7421、g:642、o:44。3.权限修改命令chmod符号法示例chmod u-x a移除文件 a 所有者的执行权限、chmod uw a.c给文件 a.c 所有者添加写权限。数字法示例chmod 764 a设置文件 a 权限为 rwxrw-r--。四、基本命令cd切换目录 cd /到根目录、cd ~到家目录、cd mycode到当前目录下的mycodepwd显示当前工作目录的绝对路径ls列出当前目录下的文件/目录touch创建空普通文件mkdir创建目录文件夹cp复制文件或目录rm删除文件或目录mv移动或重命名文件cat查看文件内容全部more分页查看文件向下翻页less分页查看文件可上下翻页tail查看文件末尾内容head查看文件开头内容find查找文件grep搜索文件内容Vim 基础使用1. 命令模式默认进入2. 插入模式可输入文本3. 末行模式执行命令模式切换i在光标前插入a在光标后插入o在当前行下方插入新行I在行首插入A在行尾插入O在当前行上方插入新行末行模式常用命令:w保存文件:q退出前提是文件未修改:wq保存并退出:q!不保存强制退出进程管理基本概念进程一个正在运行的程序PID进程唯一标识符PCB进程控制块 / 进程描述符内核中用于描述进程的数据结构bashshell命令解释器 用来与用户交互查看进程ps查看当前终端 运行的进程 -f -ef显示详细信息top动态显示进程信息进程控制kill PID结束指定进程kill -9 PID: 强制结束进程Ctrl C结束前台运行的进程Ctrl Z暂停前台运行的进程在命令后加 使其后台运行jobs查看后台运行的任务 显示任务号fg%任务号后台切换至前台bg%任务号前台切换至后台需要先ctrlz|管道将一个进程输出的信息传递给另一个进程man帮助手册man查看命令、系统调用、库函数的帮助文档1命令2系统调用3库函数Vim 操作行号设置:set nu显示行号:set nonu取消行号跳转:n跳转到第 n 行gg跳转到第一行G跳转到文件末尾复制/粘贴/删除n yy复制 n 行n dd剪切/删除 n 行p粘贴u撤销Ctrl r恢复反撤销x删除一个字符r替换一个字符R进入替换模式按 ESC 结束cc清空当前行并进入插入模式C清空光标到行末并进入插入模式/末行模式搜索n在多个搜索到的位置切换set hlsearch 设置高亮set onhlsearch 取消末行模式搜索关机与重启关机shutdown -h now、halt、init 0重启shutdown -r now、reboot、init 6解压命令tar zxf xx.tar.gz解压 .tar.gz 文件运行级别3文本模式无图形界面5图形界面模式五、编译全流程编译四阶段① 预编译处理#include、#define等预处理指令展开宏、插入头文件删除注释命令gcc -E main.c -o main.i输入main.c源文件输出main.i预处理后的C文件② 编译将C代码翻译成汇编助记符如ADD同时完成语法检查命令gcc -S main.i -o main.s输入main.i输出main.s汇编文件③ 汇编将汇编代码翻译成机器指令二进制0101命令gcc -c main.s -o main.o输入main.s输出main.oLinux目标文件/main.objWindows目标文件④ 链接合并目标文件、C标准库等生成可执行程序命令gcc main.o -o main输入main.o输出mainLinux可执行文件/main.exeWindows可执行文件编译方式分类一步编译多文件直接编译多源文件自动完成四阶段命令gcc -o main main.c add.c分步编译先分别编译main.c、add.c生成.o目标文件再链接生成main工程自动化Makefile作用管理C语言工程实现自动化编译避免手动重复执行gcc命令核心编写Makefile文件定义编译规则执行make命令自动编译六、GDB调试核心命令调试准备编译时加-g参数生成调试信息gcc -o test test.c -g常用调试命令llist 显示源代码b 行号/函数名 设置断点info break 查看所有断点rrun 运行程序nnext 单步执行不进入函数sstep 单步执行进入函数p 变量名 打印变量值ccontinue 继续运行到下一个断点finish 跳出当前函数btbacktrace 查看函数调用栈qquit 退出gdb七、静态库 vs 共享库核心定义静态库 libxx.a 预先编译好的方法的集合 编译链接阶段直接将库代码打包进可执行文件共享库 libxx.so 预先编译好的方法的集合 程序运行阶段仅在可执行文件中做标记运行时加载静态库1. 生成静态库先将源文件编译为目标文件gcc -c add.c、gcc -c max.c用ar命令打包生成静态库ar crv libfoo.a add.o max.oar静态库打包工具c创建新库r替换库中文件v显示详细过程生成的静态库命名规则libxxx.alib前缀库名.a后缀2. 使用静态库编译链接命令gcc -o main main.c -L. -lfoo-L.指定库文件搜索路径为当前目录.代表当前目录-lfoo链接名为foo的库自动补全为libfoo.a省略lib前缀和.a后缀运行可执行程序./main直接运行成功输出add5静态库在编译链接阶段就将库代码打包进可执行文件运行不依赖外部库共享库先将源文件编译为目标文件需加-fPIC生成位置无关代码gcc -c add.c -o add.o、gcc -c max.c -o max.o用gcc生成共享库gcc -shared -fPIC -o libfoo.so add.o max.o-shared生成共享库-fPIC生成位置无关代码确保库可在内存任意位置加载生成的动态库命名规则libxxx.solib前缀库名.so后缀2. 查看动态库依赖用ldd命令查看可执行程序依赖的共享库ldd main输出显示libfoo.so /lib/libfoo.so说明程序成功找到并加载了/lib路径下的libfoo.so静态库共享库区别静态库libxxx.a链接时机编译链接阶段直接将库代码打包进可执行文件特点可执行文件体积大运行不依赖外部库移植性强库更新需重新编译程序共享库动态库libxxx.so链接时机程序运行阶段仅在可执行 文件中做标记运行时加载库特点可执行文件体积小库更新无需重新编译程序运行依赖系统中的库文件需确保库在系统搜索路径中最好将库文件直接放在 存放库文件的标准目录/use/lib/lib...八、forkmain函数的3个参数int main(int argc, char *argv[], char *envp[])1.argc (argument count)命令行参数个数≥1程序名字本身也算1个参数。2.argv (argument vector)字符串指针数组存放每个命令行参数字符串。argv[0] 程序名argv[1]是第一个传入参数末尾argv[argc]NULL。3.envp (environment pointer)环境变量字符串数组格式KEYVALUE数组最后以NULL结尾保存系统全部环境变量PATH、HOME等。printf行缓冲机制用户态缓冲区printf并不会直接把内容打印屏幕数据先存放到用户缓冲区。缓冲区刷新真正输出到屏幕3种条件1. 缓冲区存满自动输出2. 遇到\n换行符 或者调用fflush(stdout)强制刷新3. 程序运行结束自动刷新缓冲区。fork1. PCB进程控制块内核结构体struct task_struct管理每一个进程每个进程拥有唯一pid进程号。2. fork()系统调用创建子进程。返回值0父进程返回值是新建子进程的pid返回值0子进程。3. fork之后子进程几乎完全复制父进程代码、数据、用户缓冲区都会复制一份父子进程是两个独立进程各自往下执行。九、for僵死进程-文件io命令解释器bash属于shell命令解释器接收用户输入和操作系统内核交互。僵死进程子进程先于父进程结束父进程没有获取子进程的退出码那么子进程变成僵死进程。解决办法父进程调用 wait() / waitpid()回收子进程资源。fork写实拷贝写时复制创建子进程时并不立刻复制物理内存页只有当进程对内存做修改的时候才复制内存页面。页面大小常见4K。vfork子进程直接共享父进程内存空间不拷贝子进程必须exit()或者exec()不能直接return。
返回列表