Linux根底
操作系统的基本概念
- 支流操作系统:Windows、Linux、Android、iOS等
- Windows:操作简略,性能较低
- Linux:操作麻烦,学习较为艰难,性能好,可移植性强。
- Android:挪动操作系统,是基于Linux开发的(应用的是Linux的内核)
- 多机开发:开发嵌入式程序须要Linux环境,同时也须要一些Windows环境,次要是因为Windows环境中有一些很好用的软件。然而同时应用两台电脑是不太可能的,所以这里就须要用到虚拟机软件了(在虚拟机中装另外一个零碎)
- 虚拟机软件VMware在Windows零碎中运行,运行后它会模仿一台电脑进去,咱们能够在这台电脑上装置其余操作系统,所以叫虚拟机。
Linux常用命令及操作
- 暗藏文件:Linux中暗藏文件是以.结尾的,跟文件属性无关。
-
man :用来查问man手册,获取对应命令的帮忙信息
- man 1 ls :1示意查问的是Linux命令(查问ls的应用办法)
- man 2 xx :2示意查问的是Linux的api
- man 3 xx :3示意查问的是C库函数
-
ls :显示以后文件夹下所有一般文件(不蕴含暗藏文件)
- ls -a :显示以后文件下所有文件(蕴含暗藏文件)
- ls -l :以详细信息显示以后文件夹下所有一般文件和文件夹
- ls -al/ls -la/ls -l -a/ls – a -l :四种办法都是以详细信息显示所有文件(蕴含暗藏文件)
-
显示详细信息后,显示出的文件类型:
- 以 – 结尾的:一般文件(二进制文件和文本文件)
- 以 d 结尾的:文件夹
- 以 l 结尾的:符号连贯文件(软连贯)
- 以 s 结尾的:socket文件
- 以 p 结尾的:管道文件pipe
-
cd :用来切换目录
- cd .. :进入下层目录
- cd ../../ :进入上下层目录
- cd test/ :进入当前目录下的test文件。
- pwd :显示当前目录的全门路(绝对路径)
-
mkdir :创立文件夹
- mkdir -p abc/DEF :级联创立文件夹(在以后文件夹下创立abc文件夹,再在abc文件夹下创立DEF文件夹)
-
mv(move) :挪动文件/批改文件名
- 用法:mv 原文件夹pathname 目标文件夹pathname
- 例如:mv def/abc ./edg (将以后文件夹下的def文件夹中的abc文件夹的内容挪动到以后文件夹中的edg文件夹中,即实现了挪动,又实现了改名)
- touch :创立空文件(留神与mv创立空文件夹辨别)
-
cp(copy) :复制文件或文件夹(与mv有点像)
- 用法:cp 源文件pathname 指标文件pathname
- cp :复制文件
- cp -f :强制复制文件
- cp -rf :复制文件夹
-
rm :删除(remove)
- rm 文件pathname :删除文件
- rm -f 文件pathname :强制删除文件
- rm -r 文件夹pathname :删除文件夹
- rm -rf 文件夹pathname :强制删除文件夹
- rmdir :删除文件夹(只能删除空文件夹)
- cat :间接在命令行下显示文件内容
-
ln :连贯文件
- 连贯文件:在Windows中,某个文件的快捷方式与这个文件就是连贯文件关系,他们是两个文件,然而有某种关联。
- 软连贯(符号连贯):成果相当于Windows中的快捷方式(源文件删除后,连贯文件也有效,有主从关系)
- 硬连贯 :源文件删除后,连贯文件任然无效,任然能关上源文件中的内容,然而源文件是曾经删除了的(没有主从关系,位置平等,删除哪一个对另一个都没影响)
- 创立软连贯文件办法: ln -s 源文件名 连贯文件名
- 创立硬连贯文件办法: ln 源文件名 连贯文件名
-
apt-get :用于在Ubuntu中在线装置/卸载软件(必须联网)
- apt-get install vim :在线装置vim
- apt-get remove vim :在线卸载vim
- 在Ubuntu中装置软件其实是十分艰难的,很容易就会装置到不适宜该版本的软件,然而应用apt-get装置软件,零碎会主动在网络中搜寻匹配的软件,不会装置不适合的版本。
- gcc 文件名 -o 可执行程序名 :编译文件(编译后会失去一个可执行程序,此时输出./可执行程序名,即可运行程序)
Linux高级命令
- find:find -name “abc” 在文件夹a目录下查找名字为abc的文件(查找文件名)
- grep:在文本文件中查找某个词(用于查找某个字符在哪些地方呈现过)具体用法在man手册中去查。
- uname:显示零碎信息(uname -a显示所有零碎信息)
- shutdowm -h now :立刻关机
- init 0 :关机
- shutdown -r now :立刻重启
- reboot :重启
- tree :从根目录开始用树形构造的形式显示文件和目录。
- mount/umount :用来挂载/卸载磁盘到文件系统中去。
- df -h :显示所有已挂载的分区列表
- du -h 文件名 :列出文件或文件夹的大小
-
用户治理:
- useradd user1 :增加一个名为user1的用户
- userdel user1 :删除一个名为user1的用户
- passwd user1 :为名为user1的用户设置明码
-
权限治理:用来管理系统中文件的权限
- r可读的数字编码4、w可写的数字编码2、x可执行的数字编码1、-无权限的数字编码0
- 三个组用户的编号:属主u、属主所在的组g、其余用户o。
- 将权限rwxr-xr-x编码为755,改为rwxr–r–编码为744
- 第一种办法:chmod 744 文件名
- 第二种办法:chmod g-x o-x 文件名 (此办法是在原有的根底上进行减少或删除权限、加增减删)
- chown :批改文件的属主
- chgrp :批改文件所属的组
-
打包文件与解压缩
- tar -czvf dir.tar.gz dir/ (将dir/目录打包成dir.tar.gz)
- tar -cjvf dir.tar.bz2 dir/ (将dir/目录打包成dir.tar.bz2,两个都是打包,只是算法不同)
- tar -zxvf dir.tar.gz (解压缩dir.tar.gz)
- tar -jxvf dir.tar.bz2 (解压缩dir.tar.bz2)
vim编辑器的应用
- vim编辑器其实就是一个软件,用来编辑代码
- Linux中自带的编辑器是vi,然而比拟好用的是vim(vi的升级版,要本人下载)
- 如果用vim关上一个不存在的文件时,零碎会主动创立一个文件。
vim根本利用
- vim有两种模式:命令模式和输出模式
- 当vim关上文件时默认处于命令模式下,按a或者i键切换到输出模式
- 在命令模式下,键盘输入的内容都被当作命令来解决,而不是输出到文件中。
- 在输出模式下按esc键退回到命令模式。
-
保留文件办法:(留神切换到命令模式)
- :wq 保留并且退出
- :w 保留但不退出
- :q 不保留退出
- :wq! 强制保留并退出
- 结尾加!示意强制执行
vim高级利用
- 查找性能:在命令模式下输出 /xxx,光标会跳转到xxx地位去。
- 疾速切换行:在命令模式下输出 :行号,就能够疾速定位到该行。
- 设置显示行号:在命令模式下输出 :set nu,就会显示行号了(:set nonu 勾销行号)
- 显示行号只会在这次关上的文件中显示,当敞开文件再次关上时,行号依然没有显示。
- 永恒显示行号办法:vim ~/.vimrc 进入配置文件,再进入输出模式,输出set nu,而后保留并退出即可。
- 行删除:将光标挪动到要删除的那一行,在命令模式下按dd即可(联合疾速切换行 :4 回车,切换到第四行,而后dd删除)
- 间断删除多行:在命令模式下按4dd,即可删除光标之后的间断4行(行数+dd)
- 行复制: nyy(n是行数,yy是复制命令)
- 行粘贴:p (p是命令,粘贴是粘贴到光标所在行的下一行)
Linux中特殊符号的含意
- 留神:上面的括号不是特殊符号,括号外面的才是。
- (.) 代表当前目录
- (..) 代表上一层目录(/bjf/abc/123,当前目录是123,上一层目录是abc)
- (-) 代表前一个目录(从/bjf/abc/123目录跳转到/edg/zxc/456目录后,456是当前目录,上一个目录是123)
- (~) 代表以后用户的宿主目录(零碎为以后用户所设置的用来寄存文件/工作的默认目录,就像Windows中的“我的文档”这个文件夹)
- (/) 代表根目录
- ($) 代表普通用户的命令行提示符。
- (#) 代表root用户的命令行提示符(管理员用户)
- (* ) 万能匹配符,能够匹配一个或多个字符。
- 例如:rm ab* 示意删除ab结尾的所有文件
普通用户与特权用户
- 特权用户:即管理员用户,领有零碎中所以势力。
- 普通用户:只能操作本人的文件,不能对其余文件进行操作,连apt-get命令都不能用。
- 用户切换:su 用户名
-
ls -l 显示详细信息时文件结尾呈现drwxr-xr-x 等字样
- drwxr-xr-x :第一个字符示意文件类型,后9个分三组3* 3示意权限。
- r可读,w可写,x可执行,- 示意无权限
- 前三个rwx示意此文件的属主的权限。
- 中三个r-x示意此文件属主所在的组的权限。
- 后三个r-x示意其余用户对该文件的权限。
- 应用sudo使普通用户长期获取管理员权限(sudo apt-get install vim普通用户下长期应用管理员权限下载vim)
VMware共享文件夹
- 作用:用来与Windows共享文件(咱们个别在Windows中写代码,在Ubuntu中编译执行)
-
设置办法
- 首先在Windows中创立一个文件夹,留神不能有中文
- VMware中,点击上方菜单栏中虚拟机–设置–选项–共享文件夹
- 文件共享后,在虚拟机中的地位是:/mnt/hgfs/ (cd 进入后能够查看)
Linux编程C语言根底补充
- Ubuntu终端中编译程序要应用gcc,具体看Linux常用命令及操作的最初一个。
- \n 换行
- 整型有正负之分,浮点型没有。
- printf中:%d对应整型,%c对应字符型,%f对应浮点型,%p对应指针变量(打印进去是指针变量的地址)
- 在C语言中:单个字符要用单引号括起来,字符串用双引号。
- 字符串“abcde”,利用sizeof算进去理论占6个字节,开端还有一个结尾字符即空字符‘\0’。
- 变量类型隐式转换:默认朝精度更高、范畴更大的方向转换。
指针
- int a;int *p;
- 指针变量p自身是指针类型,指针所指向的变量是int型,赋值时留神变量匹配。
- a :代表变量a自身
- p :代表指针
- &a :代表变量a的地址
- &p :代表指针p所在的地址
- a :示意把a看作一个指针,a是这个指针指向的变量,这个变量的地址是a的值(该符号存在但不非法)
- *p :示意指针p所指向的变量,这个变量的地址是p的值。
<code class="C">int mian() { int a = 10; int *p; //定义一个指针 p = &a; //这个指针指向变量a所在的地址。 *p = 111; //扭转指针所指地址的值,*p代表指针所指向的变量 printf("a = %d",a); //输出a = 111 return 0; }
指针与数组
- 数组的首地址和数组的首元素地址意义上是不同的,然而数值上是一样的。
- &a 是数组的首地址,要赋给数组指针;&a[0]是数组首元素的地址,要赋给int指针。
- 数组拜访形式:a[0] a[1] a[2] a[3] a[4]
- 指针拜访形式:p (P+1) (P+2) (P+3) *(P+4)
- 指针的运算:指针p加减1,示意p指向的地址后退或后移一位。
<code class="C">int main() { int a[5] = {1,2,3,4,5}; int *p; p = &a; //编译后会呈现正告,因为&a是数组的首地址,应该赋给一个数组指针。 p = &a[0]; p = a; //数组名a作右值时代表数组的首元素地址,即a[0]的地址。 }
构造体与共用体
- 构造体与共用体的定义形式和应用形式都是一样的。
- 构造体:是多个属性的联合,每个属性都是独立的。
- 共用体:是一个属性,然而有多种称说;即给共用体中的某个变量赋值时,其余变量也会跟着被赋值。
<code class="C">//构造体定义 struct jiegouti { int a; char b; float c; }; //共用体定义 union gongyongti { int a; char b; float c; };
宏定义与枚举
- 宏定义:#define N 100
- 例如:#define N (100+10)
- 留神:宏定义结尾是没有分号的,定义的如果是表达式时必须加括号。
- 利用宏定义定义一年有多少秒:#define S (3652460*60)UL
- 结尾的UL是强制类型转换,将表达式得出的后果转换为unsigned long类型,因为计算结果超出int的接受范畴。
-
留神:定义枚举时,外部的内容用逗号隔开。
<code class="C">//定义一个枚举 enum week { 1, 2, 3, }; int main() { enum week day; //定义一个枚举变量(变量类型是enum week }
变量
- 定义在函数外部的是局部变量,只能在本函数中应用;定义在函数外的是全局变量,能够在此文件中应用。
- 代码块:所谓代码块就是用{}大括号括起来的范畴都是代码块
- 作用域:局部变量的作用域就只在大括号范畴内。
- 在定义时若没有初始化,则局部变量是个随机值,而全局变量默认为0。
- 编译器编译代码时是从返回后看的,所以定义全局变量必须在结尾就定义(函数申明也必须在后面)
- 动态局部变量static:static定义的变量,只在第一次调用函数时定义,再次调用时是不会定义的(跟全局变量有点类似)
- 一般局部变量auto:auto是能够省略的。
常量
- 常量const:只能在定义时初始化赋值,其余时候不能赋值。
-
当初有一个定义:int a = 10;
- const int *p = &a; p是一个指针,指向a,此定义示意p所指向的是一个常量,即a是常量。
- int const *p = &a; p是一个指针,指向a,此定义示意p所指向的是一个常量,即a是常量。
- int *const p = &a; p是一个指针,指向a,此定义示意p自身是常量,p所指向的是一个变量,即a是变量。指针p是常量示意它只能指向a,不能指向其余中央。
- const int *const p = &a; p是一个指针,指向a,此定义示意p和a都是常量。
跨文件调用
- 跨文件函数调用:在调用前先申明此函数(跟申明本文件的函数一样的办法)
- 跨文件一般全局变量调用:在调用前先申明此变量(用extern,留神申明时不能初始化)
- 局部变量是不能跨文件应用的。
- 动态全局变量只能在本文件应用,其余文件即便申明了也不能应用,然而其余文件能够定义雷同名称的变量(这就解决了变量重名的问题)
头文件援用
- 例如: #include <stdio.h>
- 尖括号<>:用来蕴含零碎自带的头文件。
- 双引号“”:用来蕴含咱们本人写的头文件(.h文件)
-
本人写头文件时,留神避免反复蕴含。
<code class="C">#ifndef __A_H__ #define __A_H__ //避免反复蕴含 //在此区域写申明 #endif