磁盘相关命令
df//查看磁盘整体状况
df -h //查看磁盘整体状况
du //查看磁盘使用情况,如果不加目录,默认为当前目录
du -h -d 0//表示我们只希望看当前目录磁盘使用情况,不会继续展示这层目录的下一级目录
du -h -d 1//表示展示当前目录的下一级目录磁盘使用情况,-d是可以指定查看层数的
远程拷贝
实现文件的上传和下载,把远程机器的文件拷贝的本地(下载),以及把本地的文件上传到远程机器(上传)
scp(secure copy):使用的协议是ssh协议
本地路径比较好写:可以使用绝对路径和相对路径
远程路径比较难处理:用户名@远程服务器IP:目标路径路径 (这是一种指定远程路径的方法)
示例,使用windows上传文件到ubuntu虚拟机
- 最开始没有上传时ubunt虚拟几个普通用户加目录文件
- 使用windows将本地文件上传到Ubuntu系统中mask用户的根目录下
scp FileName UserName@TargetIP: targetfile
scp 要上传的文件名 目标机器的用户名@目标机器的IP:上传文件的目标位置
-
登录Ubuntu服务器可以查看到上传的文件
-
从Ubuntu服务器下载文件
除了上面这样使用用户名和密码进行验证实现上传和下载功能,我们还可以使用密钥和公钥的方式进行验证登录,在验证身份时我们会用自己的密钥和别人传过来的公钥进行配对,如果匹配成功,那么就可以实现登录等一系列操作
-
生成自己的公钥和私钥,先cd 到自己目录下的 .ssh/ 目录
-
查看自己的公钥和私钥,id_rsa就是我们创建的私钥,id_rsa.pub就是我们创建的公钥
-
有了公钥我们就可以让其他设备直接使用公钥和我们建立连接,这里使用的时gitee代码管理仓库来实现我们的对接,查看公钥并且将公钥配置在我们的gitee仓库之后,我们就可以不用输入密码直接在gitee仓库上push,clone,pull代码
此时我们就可以在Ubuntu上快乐的实现操作gitee仓库的代码啦
c在linux上的编译过程
c语言程序在linux上运行,首先编译器会将 *.h文件和 *.c文件进行预处理形成预处理后文件 *.i文件,然后 *.i 文件会经过编译形成 *.s 汇编文件 ,然后再经过汇编形成 *.o 目标文件 ,最后再进行引导代码和库函数的链接 形成没有后缀的 * 可执行文件
预处理指令
g++ -E hello.c -o hello.i
// -E代表执行预处理
// -o是指定输出文件
1. 预处理的作用
执行预处理指令,预处理指令包含如下指令
(1)#include 文件包含
(2)#define M 5 宏定义(简单的文本替换)
(3)#define size(a)(sizeof(a) / sizeof(a[0])) 宏定义
宏开关
#if #else #endif(不常用)
源代码
执行代码进行预处理`g++ -E hello.c -o hello.i`
预处理之后生成的代码
#ifdef N #else #endif(常用)
防御式声明,为了避免重复包含多个头文件
源代码
执行代码进行预处理g++ -E hello.c -o hello.i
预处理之后的代码
重新执行一下代码进行编译,后面的 -D表示添加define宏定义 后面的N表示添加的宏定义名称叫做Ng++ -E hello.c -o hello.i -D N
编译之后的代码
我们可以看到相同的代码但是再我们执行不同的编译指令之后,预处理出来的代码都是不一样的,这样子就给我们后面进行移动开发进行不同设备之间的代码编译时提供了便捷
#ifndef #else #endif
执行是上面的相反结果
2. 编译
将c语言代码编译成汇编代码
两种风格的汇编代码
(1)AT&T汇编
(2)x86/x86_64
他俩的区别就是目标寄存器和原寄存器位次不一样,他俩刚好反过来的
源代码
执行以下代码(先将源代码进行预处理再进行编译)
gcc -E hello.c -o hello.i
gcc -S helli.c -o hello.s
或者一步到位,直接将源代码编译成 *.s 汇编代码
gcc -S hello.c -o hello.i
pushq %rbp //会将%rbp寄存器的值保存在栈帧中 movq %rsp , %rbp //会将%rsp 的值移动到%rbp中,这样他们相减为0,说明main函数的栈帧大小为0 leaq .LC0(%rip),%rdi //%rip中存储的是hello world字符串的地址,会将此地址赋值给 %rdi ,%rdi一般是存储第一参数 call puts@PLT //调用printf内置函数 movl $0,%eax //执行return 0 的操作,将0 存储在%eax寄存器中 popq %rbp //恢复%rbp寄存器的值 push 入栈 mov 移动(赋值) pop 出栈 lea (load effictive address)相当于&,加载有效地址 call 函数调用 ret 函数返回 %rbp -->base pointer 栈帧基址寄存器 %rsp -->stack pointer 栈顶寄存器 %eax -->存储返回值