(一)初识Linux:
免费,开源
内核版本:源代码
发行版本:不同公司对源代码做的定制
Linux上的目录相当于Windows上的文件夹
根目录下的文件夹中分别存放什么东西:
-
bin:存放一些命令:ls ; ps 等等。相当于windows系统下的一个可执行程序 (.exe)
-
boot:存放系统内核
-
dev:存放设备文件,硬件设备被抽象为文件放在dev里。stdin:代表键盘;stdout:代表屏幕等等一个个设备
-
etc:存放系统的配置文件:调系统的IP地址;对系统的启动级别进行设置等等对系统的一些设置操作。主要存放一些文本文件,记录一些信息
-
home:普通用户的家目录(Linux系统是一个多用户(2个以上的用户可以同时登录一台计算机)的系统)不同的用户只有在自己的家目录下才可以实现创建文件,修改文件,删除文件等操作
‘~’ :就代表该用户在自己的家目录下
* -
root:管理员的家目录
-
lib:存放库文件的地方:C语言的库函数
-
proc:虚拟的目录,存放进程在内存中的一个映像(像访问文件一样,查看内存中的一些内容,系统关机以后,该目录下的文件就会消失)
-
usr:存放系统运行过程中不经常改变的一些文件:安装了一个软件
-
var:存放一些经常改变的文件:安装一个软件后常常产生一些数据
-
tmp:临时文件,除了家目录以外,用户也可以在该目录底下创建文件,修改文件等等
-
mnt:是临时挂载点。例如,把优盘插在电脑上,想要访问优盘里面的内容,它就必须出现在整个目录树里面,此时就会把优盘挂载到mnt底下,此时进入到mnt底下就相当于进入到优盘里面,就可以查看优盘里面的内容。
进入家目录:家目录就是home底下以该用户命名的文件夹:/home/xsy
home底下会存放多个用户的家目录
cd是命令;‘~’ 是参数;命令与参数之间有至少一个空格
(二)命令
1.基本命令:
- 1.1 man:查看帮助文档,当命令和函数重名,需要带上序号
1:代表命令
2:代表系统调用:其实现在内核中
3:代表库函数
- 1.2 cd:改变当前路径,cd后加一个用户想去的位置:
cd只能进入文件夹:cd tmp。
不能进入普通文件: cd file.txt;//error;普通文件只能查看内容,编辑它,由vi或cat打开
绝对路径走法:所有路径都从根开始
去根目录下:cd /
去home底下:cd /home
cd /home/xsy/217/tmp - 1.3 pwd:显示当前位置
- 1.4 ls:显示当前目录底下有那些文件,显示指定目录底下的文件。
ls -l:显示当前目录底下所有文件的所有信息
ls -a:显示所有文件,包括隐藏的文件(以点‘.’开头的文件) - 1.5 chmod:修改文件权限
- 1.6 touch:创建普通文件
- 1.7 mkdir:创建目录文件(文件夹)
- clear:清屏
*1.8 rm +普通文件名:删除普通文件
rm -f +普通文件名:当该目录下没有该删除的文件会报错,加上-f 不给错误提示
rm -rf +目录文件名:删除的目录文件本来就没有,所以不用报错
rm -r +目录文件名:删除空文件夹或非空文件夹(本质上只能删除普通文件和空文件夹,所以删除目录文件时是先进去将它里面的普通文件全删除,然后它变成空文件夹,然后再把它删除)
*1.9 rmdir +目录文件名:删除空文件夹
*1.10 cp +文件名 文件名:拷贝普通文件到当前位置
将文件foo.h拷贝到当前位置并修改名字为f1
将普通文件f1拷入目录文件temp中
*1.11 cp -r +目录文件名 目录文件名:拷贝目录文件
将目录文件temp拷贝到当前位置并且修改名字为temp1
将目录文件day01拷贝到目录文件temp1中(因为都是在当前目录,所以不用加绝对路径)
*1.12 mv:移动文件;修改当前目录下文件夹的名字
将目录文件day01移动到目录文件temp中
将目录文件temp移动到temp1中并且修改名字叫temp2
修改temp1的名字为mytemp1
-
1.13 find:查找文件
在用户自己的家目录下面,按名称的方式查找 passwd文件:
在根目录下面,按名称的方式查找 passwd文件:
-
1.14 grep:在指定的文件中找到存在指定的字符串的行并打印(读一个文件,给定一个匹配条件)
在main.c文件中找到含有include的行
-c:显示有几行
-n:显示行号
与管道结合过滤信息:
在bin目录下查找含有“bash”的文件
ls会将结果打到屏幕上,现在让ls的结果写入管道(| :管道可以在俩个进程间传递数据),然后用grep再将数据从管道中读出来,匹配条件就是bash
-
1.15 wc:统计文本文件行数(-l),单词数(-w),字符数(-c)
2.文件查看命令:
- 2.1 cat:向文件中输入数据:从键盘输入数据到新建文件file1中(结束输入:Ctrl+d)
2.1.1可以查看文件的内容(适合文件内容较少的)
2.1.2合并文件
-
2.2 more: 分屏显示文件内容,不能修改,只能查看(适合文件内容较多)
敲回车:显示下一行
敲空格:显示下一页
-
2.3 less:反复查看文件内容(q:退出)
-
2.4 head:默认显示文件头10行
显示头3行:
-
2.5:默认显示文件末尾10行
显示末尾2行:
3.文件编辑命令:
*3.1 vi/vim:vi是文本编辑工具,vim是vi的升级版本
注意:用vim打开一个文件,一定要正常退出。因为当vim打开一个文件,系统会自动生成一个.swp的隐藏转换文件,用来标识该文件已经被用户打开并使用,当用户正常退出关闭文件系统会自动删除该隐藏文件。因此当不正常退出,系统生成的隐藏文件会继续保留,当用户在其他终端,或者下一次继续打开该文件时,系统会报错
安装vim的命令
vi的3种模式:
1.命令模式:只能识别用户输入的一些命令**(输入命令 ‘ i ’ :切换到插入模式)**
2.编辑模式(插入模式):可以进行编辑
命令“ESC” :从插入模式回到命令模式
3.末行模式:保存或退出文件,执行搜索
“ :wq” :保存并退出
“ :q! ”:不保存退出
末行模式下的操作
- 文件另存为:
当文件失去写权限,但又在该文件中写了数据,此时需要重新保存
:w + 绝对路径+文件名
:+ w + b.c ->保存在当前目录下,文件名字为b.c
vi的操作命令:
- ESC + n + yy :复制n 行
- 将光标移动到需要复制的行,按p实现复制
- u :撤销一次复制操作
- Ctrl + r:恢复一次撤销操作
- dd:删除一行
- n + dd:删除n行
- dd+p 从该处删除,挪到别处(剪切)
- Shift + c :删除一行光标后面的内容
- cc :删除一行
- : n :光标移动到第n行
4.文件压缩与解压命令:
打包:
压缩:
释放时先解压再解包:
解压:
解包:
一步解压解包:
5.进程管理命令:
命令解释器(shell): bash,内核与用户交互的桥梁,每打开一个终端,都会首先运行一个bash,用户输入的所有命令都是由bash 解释执行
进程:一个正在运行的程序
进程控制块(PCB):
- 5.1:ps:显示在当前终端中执行的命令(进程)
5.11 ps -f :显示当前终端进程的详细信息
5.12 ps -ef:显示系统所有的进程详细信息
-
5.2 kill:结束某一个进程,但是结束不了一个已经停止的进程
-
5.2.1 kill -9:强制结束
-
5.3前台与后台运行程序
前台执行:只有该命令结束了才可以执行下一条命令
结束前台命令的方法: Ctrl + C 或者直接 kill 原理一样
停止前台运行进程: Ctrl + Z
后台执行:命令执行不占用命令终端,在后台执行,用户可输入下一条命令继续执行(多条命令同时执行),后台命令Ctrl + C 无法结束
-
5.4 jobs:查看后台运行的程序。jobs -l :显示更多信息
-
5.4 前后台命令切换:
第一步:将前台运行命令Ctrl + Z 停止。
第二步:bg %任务号
5.4.1 bg:将前台运行命令切换到后台运行
5.4.2 fg %任务号:将后台运行命令切换到前台运行
-
5.5 pkill:结束自己运行的一组进程
-
top:系统检测工具
(三)文件
1.文件类型
(1)Windows系统下的文件类型:
- .txt:文本文件
- .jpg:图片文件
- .exe:可执行程序
(2)Linux系统下的文件类型:
-
‘-’:普通文件(文档文件):Windows 系统下的电影,图片,可执行程序,.C代码,在Linux系统下就属于普通文件。几乎可以由U盘拷走的都属于普通文件
-
‘d’:目录文件(Windows系统下所说的文件夹)
-
‘l’:链接文件
-
‘p’:管道文件
-
‘c’,‘b’:设备文件
-
‘s’:套接字文件
-
隐藏文件:以点‘.’开头的文件:例如 .a.c
在家目录创建文件夹:
在文件夹中创建一个普通文件:
2.文件权限
(1)修改文件权限文字设定法:
文件操作对属主减去写权限:
文件操作对属主加上写权限:
文件操作对其他用户加上所有权限:
(2)修改文件权限数字设定法:
属主:r+w+x
同组人:r+w+x
其他人:r+w
(四)Linux上C程序编译与调式
指令格式:
Windows: PE
Linux: ELF
gcc
gcc用于编译C程序-------->.c
g++用于编译C++程序---->.cpp
用户写好的C程序,计算机不认识,需要将其转变成计算机可以识别的二进制指令
此时的main程序具有执行权限
运行main程序:
1 ./main:当前目录下的main程序
2 绝对路径下的main程序
1*.c程序到可执行程序:
(1)预编译:
内容:
- 将头文件中的内容拷贝复制到*.i文件中
<stdio.h>中没有printf函数的实现,只有函数声明。函数实现在C的标准库里 - 替换宏定义
- 删除注释
(2)编译:
该过程一般可以检查出语法错误
内容:
- 编译之后生成汇编代码
(3)汇编:
内容:
- 对汇编代码汇编生成机器指令
- 生成*.o文件,只能在目标机器上执行的二进制文件(Windows上称为 *.obj文件)
(4)链接:
链接出的可执行程序main 比main.o大的多
内容:
- 把需要实现的库函数(printf) 链接到main中
- 确定一些变量的地址(逻辑地址)
- 确定的逻辑地址(函数入口地址,全局变量地址…)存放在一个文件中,不会改变,临时变量地址会改变
2.编译链接一步完成
3.多文件编译示例
(1)分步编译:
(2)一步完成:
(3)makefile文件
- 适用于 . c文件较多,gcc不方便
- makefile 文件是文本文件,需要写清楚最终生成的可执行程序是谁,以及该可执行程序要如何生成(依赖关系,规则)
自动调用清除函数删除* .o 文件
(4)gdb调试
对象:正在运行的程序
类比VS:
- Debug模式: - g
- Release模式:删除 - g
gcc调试:加 - g
-
makefile 文件调试
不需要调试时删除 -g
但是此方法操作麻烦,故改进如下:
当不需要调试信息时,删除 - g
调试过程: -
gdb + 需要调试的可执行文件名
-
显示代码 l (list)
-
在第n行加断点:b(break) n
-
在函数入口地址加断点:b 函数名
-
显示在那些行加了断点:info break
-
删除断点:delete 断点编号
-
启动程序进行调试: r
-
单步执行: n
-
敲完n直接敲回车 重复上一步命令(不用一直敲n)
-
显示变量 i 的值: p i
-
显示 变量i 的地址: p &i
-
跳出循环:先delete 后 c
-
程序继续执行,遇到下一个断点就会停下来: c
-
进入函数:s
-
显示函数调用:bt
-
退出: q
(五)库文件
库:预先编译好的方法(函数)的集合
库文件的声明:“foo.h" 放在 /usr/include 底下
库文件:libfoo,a 放在/lib 底下,或者/usr/lib底下
1.静态库:
形式:libxx.a
静态库创建过程:
- 创建* .c文件。一个* .c文件中可以有多个函数实现,不一定一个文件中只实现一个方法
- 编译*.c文件创建库
用头文件链接:
头文件与主函数不在一起:
头文件与主函数在一起:
头文件放在usr/include底下:
库文件:libfoo,a 放在/lib 底下,或者/usr/lib底下,不用指定位置
- 调用库文件编译链接
不标准的方法:
标准方法:
2.共享库:
形式:libxx.so
C的标准库就是一个共享库,将所有库函数的实现预先编译好
创建一个共享库并使用:
通过改变环境变量,来告诉编译器,此时共享库不在标准目录底下,在指定的目录底下(该方法只在当前窗口有效)
目的:开发过程中并不知道新开发的库对原库有没有影响,因此需要先在本地目录下测试
3.静态库与共享库的区别:
区别:
-
Windows上一般称为静态库和动态链接库
-
当/lib底下同时存在静态库和共享库时,系统默认优先调用共享库
-
当静态库改变,必须重新将.c文件编译链接到可执行文件中
但是共享库改变就不需要,因此共享库有利于开发