前言
我个人在实训之前对Linux是不太熟悉的,即便是学Android的时候也没有对Linux的机制有深入系统的研究,谁知学校竟然有这门课,👨笑了,三个星期能学啥啊?而且是上华清的网课,听吹牛吧!算了,就将听到的有用的暂且记录之。扬帆,启航!
(安装VM后打开Ubuntu,这页面,啧啧,习惯Windows的我手足无措啊!!)
1.常用命令
1.pwd:(print working directory)打印当前工作目录
farsight@ubuntu:~$ pwd
2.ls:列出当前工作目录的文件
farsight@ubuntu:~$ ls
ls+目录名:列出指定目录内文件
ls YQYUN
ls -l:列出当前工作目录内的详细文件信息
farsight@ubuntu:~$ ls -l
3.mkdir+文件夹名:在当前工作目录创建文件夹
farsight@ubuntu:~/YQYUN$ mkdir day5
farsight@ubuntu:~/YQYUN$ ls
day1 day2 day3 day4 day5
4.touch+文件名:在当前工作目录创建文件
farsight@ubuntu:~/YQYUN/day5$ touch day5.c
farsight@ubuntu:~/YQYUN/day5$ ls
day5.c
5.rm+文件名/ -r+文件夹名(rmdir效果一样)
farsight@ubuntu:~/YQYUN/day5$ rm day5.c
farsight@ubuntu:~/YQYUN/day5$ ls
farsight@ubuntu:~/YQYUN$ rm -r day5
farsight@ubuntu:~/YQYUN$ ls
day1 day2 day3 day4
6.cd+目录名:切换工作目录
farsight@ubuntu:~/YQYUN$ cd day5
farsight@ubuntu:~/YQYUN/day5$
cd:回到开机时的默认工作目录
cd+ …:回到上一级目录
farsight@ubuntu:~/YQYUN/day5$ cd
farsight@ubuntu:~$ cd YQYUN
farsight@ubuntu:~/YQYUN$ cd ..
farsight@ubuntu:~$
7.mv+移动的文件名+目标目录:移动文件到指定目录
farsight@ubuntu:~/YQYUN/day5$ ls
day0.c day5.c dir
farsight@ubuntu:~/YQYUN/day5$ mv day5.c dir
farsight@ubuntu:~/YQYUN/day5$ cd dir
farsight@ubuntu:~/YQYUN/day5/dir$ ls
day5.c
mv+已存在的文件名+不存在的文件名:重命名文件
farsight@ubuntu:~/YQYUN/day5$ ls
day5.c
farsight@ubuntu:~/YQYUN/day5$ mv day5.c day0.c
farsight@ubuntu:~/YQYUN/day5$ ls
day0.c
8.su:切换成root权限(系统的最高权限,为所欲为)
farsight@ubuntu:~/YQYUN/day5/dir$ su
Password:
root@ubuntu:/home/farsight/YQYUN/day5/dir# (注意工作的路径变了)
su+用户名:切换用户
换回来了
root@ubuntu:/home/farsight/YQYUN/day5/dir# su farsight
farsight@ubuntu:~/YQYUN/day5/dir$
9.Ctrl+l或clear:清屏(实际上只是页面上拉腾出来干净的一页)
10.Ctrl+shift+n/t:创建新的终端或标签(鼠标右键第一选项和第二选项)
11.Ctrl+空格:切换Linux中的输入法(在上方状态栏点击键盘图标亦可)
12.方向键上下:选择最近的命令
13.ifconfig:查看网络信息
farsight@ubuntu:~/YQYUN/day5/dir$ ifconfig
eth0 ~~~~自己看~~~~~
lo ~~~~~自己看~~~~
14.ps:查看进程状态
top:实时查看内存状态
farsight@ubuntu:~/YQYUN/day5/dir$ ps
PID TTY TIME CMD
4838 pts/2 00:00:01 bash
5150 pts/2 00:00:00 su
5158 pts/2 00:00:00 bash
5246 pts/2 00:00:01 ps
15.kill+PID:杀死进程
应用卡住就可以强制退出了
farsight@ubuntu:~/YQYUN/day5/dir$ top
top - 23:55:31 up 6:14, 2 users, load average: 0.23, 0.14, 0.09
Tasks: 211 total, 2 running, 208 sleeping, 0 stopped, 1 zombie
Cpu(s): 1.5%us, 0.3%sy, 0.0%ni, 98.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1026452k total, 920768k used, 105684k free, 98684k buffers
Swap: 1046524k total, 1700k used, 1044824k free, 373356k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3441 farsight 20 0 204m 54m 25m S 2 5.4 9:53.48 codeblocks
farsight@ubuntu:~/YQYUN/day5/dir$ kill 3441(之后PID对应的应用就强制停止了)
16.TAB键可以补全命令,连按两次可以给出所有相关的命令
farsight@ubuntu:~/YQYUN/day5/dir$ k
kbd_mode kbdrate kerneloops kerneloops-submit kill killall killall5 koi8rxterm
2.编辑器及编译器
一、编辑器
(个人不喜欢Linux自带的编辑器和编译器,界面丑且管理工程不方便,还是喜欢简单方便的跨平台IDE,像codeblock就很好)
1.gedit:进入方式:geit+文件名(和记事本差不多)
2.装了很多插件勉强和IDE媲美的VI/VIM:进入方式:vi/vim+文件名(有则打开,无则创建并打开)
farsight@ubuntu:~/YQYUN/day5$ ls
farsight@ubuntu:~/YQYUN/day5$ vim day5.c
(哦,上帝,瞧瞧这狗屎一样界面,我发誓要狠狠的打他的屁股!)
vi/vim的三种模式:命令行模式,插入模式,低行模式
(1)命令行模式是默认模式,可以对代码进行复制、粘贴、剪切、撤销等文本级操作,但不能从键盘输入代码:
复制:[num]yy:从光标所在行开始的[num]行进行复制,[num]为1可省略;
粘贴:p:从光标所在行后的下一行开始粘贴;
删除/剪切:[num]dd::从光标所在行开始的[num]行进行删除剪切,[num]为1可省略;
删除光标所在的字符:x;
撤销:u,反撤销:Ctrl+r;
(2)插入模式:在命令行模式下按 a(光标后一个位置进入)/i(光标所在行进入)/0(光标下一行),都可进入(其实都没啥区别!!);
退出插入模式:esc键;
(3)低行模式:在屏幕低行,所有命令以“:”开头,常用如下;
保存文件-> :w;
退出vi/vim-> :q(强制退出:q!,不保存文件修改);
保存并退出-> :x或:wp;
分屏显示-> :vsp+文件名;
列出/取消行号-> :set number/ nonumber;
二、编译器
GCC编译器被很多IDE直接集成了,编译链接运行直接一气呵成,在shell中通过如下命令使用GCC;
用法:gcc [-选项] 文件名
编译基本步骤:
1.gcc +文件名:默认生成一个叫a.out的可执行文件;
gcc -o +不带后缀新文件名+源文件:编译源文件,并生成一个不带后缀的新文件
farsight@ubuntu:~/YQYUN/day5$ gcc -o day5 day5.c
ls
farsight@ubuntu:~/YQYUN/day5$ ls
day5 day5.c
2…/a.out:执行a.out
farsight@ubuntu:~/YQYUN/day5$ ./day5
hello Linux
3.使用C99标准编译
for(int i=0;i<2;i++)
printf("hello Linux");
编译
farsight@ubuntu:~/YQYUN/day5$ gcc -std=c99 -o day5 day5.c
farsight@ubuntu:~/YQYUN/day5$ ./day5
hello Linux
hello Linux
4.gcc -wall:显示更多的警告信息
gcc编译的4个过程:
(1)预处理(头文件展开,宏替换)
farsight@ubuntu:~/YQYUN/day5$ ls
day5.c day5.h day5.i test.c test.h 文件夹
farsight@ubuntu:~/YQYUN/day5$
(2)编译(进行语法检测,然后汇编)
farsight@ubuntu:~/YQYUN/day5$ gcc -S day5.i -o day5.s
farsight@ubuntu:~/YQYUN/day5$ ls
day5.c day5.h day5.i day5.s test.c test.h 文件夹
(3)汇编(汇编代码翻译成机器语言)
farsight@ubuntu:~/YQYUN/day5$ gcc -c day5.s -o test.o
farsight@ubuntu:~/YQYUN/day5$ ls
day5.c day5.h day5.i day5.s test.c test.h test.o 文件夹
(4)链接(链接库函数,系统函数,和自己生成的.o文件)
farsight@ubuntu:~/YQYUN/day5$ gcc test.o -o test
3.工程管理make和gdb调试
1.make:工程管理器,管理较多文件,也是一个“自动编译管理器”(根据文件的时间戳自动选择已经编译过的,通过读取Makefile文件批量编译)
2.Makefile:3种简单语法如下,注释用#
#目标:依赖
# 执行语句
#语法一:
#目标名:main.c +各种.c文件
# gcc main.c+各种.c文件 -o+可执行文件名
#eg:
day: day5.c test.c
gcc day5.c test.c -o day
#语法二:
#目标名:main.o +各种.o文件
# gcc main.o+各种.o文件 -o+可执行文件名
#同上不举例了
#
#语法三:
#SRC=main.o +各种.o文件
#目标名:$(SRC)
# gcc $(SRC) -o+可执行文件名
#eg:
SRC=day5.o test.o
day:$(SRC)
gcc $(SRC) -o day
编写好makefile之后,直接使用命令make编译整个项目
farsight@ubuntu:~/YQYUN/day5$ vim makefile
farsight@ubuntu:~/YQYUN/day5$ make
2.gdb调试,
进入方式:
在编译时加 -g (默认生成a.out文件),随后用 gdb a.out进入调试界面
可用功能:
(1)设置断点(b+行号)
(2)查看代码(l)
(3)运行至断点(r)
(4)查看变量的值和地址(p+变量名)
(5)单步运行(s)
(6)退出调试(q)
(…)…
OK,介绍完了这无聊的vi/vim和GCC,我还是用codeblocks吧。👨
4.ANSI C基础回顾
这简直就是多余了啊,都要毕业了,还给我们整C,👨笑了!
-
C基础:{
1.关键字:int char float if else for while
2.用户标识符:注意命名规则
3.标准输入输出:%d %c %f %s }1.运算符:{ + - * / % /:只取整数部分 %:只取余数,不能是浮点型 }
2.控制语句:{ 顺序 分支 循环
1.控制语句:{
1.if-else:{ 语法结构:
if (表达式1)
{
if(表达式3)
{
语句序列3;
}
}
else if(表达式2)
{
语句序列2;
} 注意:1.if可以没有else,但是else就不能没有if
2.else总是与上一个未配对的if配对
3.if后有表达式,else后面就没有表达式 }
2.switch-case:{ 语法结构:
switch(表达式/值)
{
case 表达式1:
语句序列1;
break;
case 表达式2:
语句序列2;
break;
…
case 表达式n:
语句序列n;
break;
default:
语句序列n+1;
break; //可写可不写
}
注意:switch遇到break或者default才退出 }
3.for:{ 语法结构:
for(表达式1; 表达式2; 表达式3)
{
语句序列;
} }
4.while:{ 语法结构:{
while(表达式)
{
语句序列;
} } } }
2.数组:{
1.数组的定义:数据类型 数组名[元素个数];
2.数组元素的访问:数组[下标]//下标的下限0 } }1.指针:{ 提供一种访问变量的方法 int a; a = 10;//直接访问 a = 5;
0.0.地址:每一字节的内存编号
0.1:& *:{ &:取地址运算符 用法:&变量名 eg:&a;
*:解引用//取地址里的内容 用法:*指针名
eg:*p }1.什么是指针:{ 指针:就是地址 指针变量的定义:数据类型 指针名;//这里的是标志变量是一个指针 如何区分的两种用法:
1.如果前面有数据类型,那就是在定义一个指针变量
2.其他情况就是在取指针所指向变量的内容 }
2.指针和变量的关系:{ int a = 10;//0x1000 int *p; //0x2000 p = &a; *p = 5;//间接访问
关系:p = &a = 0x1000;
*p = a = 10;
&p = 0x2000;//二级指针保存一级指针的地址 }
3.指针和一维数组的关系:{ int a[10] = {1,2,3,4,5};//数组名代表整个序列的首地址 int *p; p = a;//p = &a[0]; 在某些情况下,指针名和数组名可以相互转换 } }2.函数:{
1.函数的定义:{ 语法结构: 数据类型 函数名(形参说明) {
语句序列;
return (表达式/值); } 数据类型:函数的返回值类型
无返回值:void
有返回值:int char short 地址/指针… 函数名:遵循命名规则 形参说明:数据类型 形参名//如果有多个形参,中间以逗号隔开 语句序列:函数体,可以没有 return :返回可以是表达式,也可以是变量值
eg: int sum(int a, int b)
{
int result = a+b;
return result;
//return (a+b);
} }
2.函数声明:数据类型 函数名(形参说明); 注意:函数声明要放在main函数之前
如果不写函数声明,直接函数实现,也要放在main函数之前
eg:int sum(int a, int b);
3.函数调用:函数名(实际要处理的参数);//简称实参
eg:sum(a, b);
sum(666, 999);
注意:如果函数无返回值,必须自成一行
如果函数有返回值,可以自成一行
4.函数传参:{ 值传递:仅仅把实参的值,拷贝一份给形参,对形参的修改是不会影响实参 地址传递:把实参的地址传过去,形参是指针//通过指针访问变量 }
5.指针函数:返回值是地址 }3.分文件:{
-
.h文件:函数声明、全局变量定义、数据类型定义…
-
.c文件:进行函数实现
-
.c文件:含有main的文件 … }
1.结构体:{
1.为啥要使用结构体:处理复杂的数据结构
2.结构体的一般形式:{
struct 结构体名{
数据类型1 成员1;
数据类型2 成员2;
…
数据类型n 成员n;
};大括号内的内容成成员列表或者域表
数据类型可以基本的数据类型和数组类型,也可以是结构体类型
不要忘了最后有个分号
}
3.定义结构体变量
4.访问结构体成员
}
-
2.typedef:取别名
用法:typedef 已有的数据类型名 要取的别名
哎呀,基础就是这!其他的什么指针数组,数组指针,函数指针,指针函数的区别也是很重要的,特别是函数指针,这可是C中可以媲美其他语言的类的方法的存在,OK,坐等实训第二周