1 Linux介绍及环境配置
Unix Linux GNU
Unix操作系统是一个多任务多用户的分时操作系统。1969年的AT&T公司开发
Linux是操作系统内核。是1991年林纳斯。托瓦兹创造的开源,可靠,稳定,安全,多平台
常说的Linux操作系统是GNU/Linux操作系统(类Unix系统)
GNU是一个操作系统,其内容软件必须通过gpl方式发布。GNU是类Unix操作系统
环境介绍
VM虚拟机,使电脑运行多个系统
Ubuntu是以桌面应用为主的Linux系统
vmware tools
vmware的增强虚拟显卡和硬盘功能。可以更好的和window系统互动。如共享文件夹和复制粘贴
如果不能安装看看CD设置
安装方式下载完后解压./vmware_install.pl
安装过程中,双击提示,按下滚轮即可直接打出需要的内容
Vim
Vim是从vi发展来的文本编辑器
网络配置
三种模式:桥接模式,nat模式,仅主机模式
网络配置图
桥接模式,可以认为虚拟机是一个独立的网络。与开发板通信常用桥接模式
nat模式,局域网访问不到在nat模式的系统
仅主机模式,只能和主机进行通信,不能访问外网和局域网
查看网络配置 ifconfig
ping不通,看看dns配置和电脑的dns是否配置一样。
2 软件包管理
软件包管理
流行的软件包管理机制-deb软件包和RPM软件包
APT软件管理机制:1 检查和修复软件包依赖关系;2 利用Internet网络主动获取软件包
Ubuntu有两种软件包:.deb(二进制软件包)和.debsrc(源码包)
deb可以直接用来安装使用
debarc需要自己编译
file 〈软件包名〉命令 查看软件包类型
软件包命名:软件包名+软件版本+修订版本+体系架构
在线软件包管理
APT工作原理:集中式的软件仓库机制
软件源配置文件位置:/etc/apt/sources.list
更新软件源:1 修改/etc/apt/sources.list文件。2 图形界面更换软件源3sudo apt-get update
APT相关指令表
离线软件包管理 dpkg相关命令表
3 shell命令(权限,输入输出)
shell介绍
定义:shell是一个命令行解释器。他为用户提供了一个向内核发送请求以便运行程序的界面系统程序;shell还是一种编程语言和脚本语言
shell是翻译一条语句执行一条语句
cat /etc/shells 查看当前系统有哪些shell
echo $SHELL 查看当前是什么shell
shell命令练习:
1立刻关机 sudo shutdown -h now
2立刻重启 sudo shutdown -r now或者 sudo reboot now
3定时关机 sudo shutdown -h +〈时间〉
4定时重启 sudo shutdown -r +〈时间〉
权限相关命令
普通用户和超级用户
切换用户su -c 〈命令〉〈用户名〉或者
切换用户su -l 〈用户名〉代表用户和环境都切换;su 〈用户名〉只代表用户进行了切换
如果切换用户不成功,加上sudo就可以了
设置用户密码 passwd 修改自己密码 passwd username修改指定用户密码
如果想设置简单的密码,sudo passwd就可以了
用户权限中9个字符分别代表着当前用户权限,同组用户权限,其他用户权限
sudo chmod u+w 给自己用户添加一个写的权限
基本指令
pwd,lscd,touch,mkdir,rmdir,cp,mv,
man使用表
主要使用2和3查找
man没有原型时要换其他源
date打印和设置系统时间
date使用表
date +&T 或者date %H:%m打印时间
date +%Y/%m/%d 显示年月日
clear 清空命令行(或者crtl+l)
df -a列出文件系统;-k(-h)列出磁盘分配情况; -l仅列出本地文件系统
du -a列出空闲的文件数;-h列出磁盘使用情况;-s列出总得空闲空间
输入输出操作
输出命令echo(-n不换行,-e使能转义-E不使能转义)
echo"$a"能取出a的值,echo`$a`原样打印$a
Linux默认的输入定义为键盘,输出定义为终端窗口
标准输入(stdin,文件描述符为0)默认从键盘输入
标准输出(stdout,文件描述符为1)默认输出到屏幕
标准出错(stderr,文件描述符为2)默认输出到屏幕
使用重定向的原因
输出重定向符表
输入重定向符
输出输入相关操作
通配符表
“|”管道可以把一系列命令连接起来,如cat file | wc -l 统计file文件有多少行
历史查询 history,把之前的命令打印出来
自动补齐 tab键
命令置换`,让命令不在直接输出出来可以用来把命令付给变量
4 shell命令(文件搜索,文件处理,压缩解压)
查看文件相关命令
cat 不加文件名就是等待输入
tac 〈文件名〉从后往前打印出来文件内容
more 〈文件名〉一页显示不完可以按回车继续向下显示,但是不能向上
less 〈文件名〉按↑↓继续显示
head 〈文件名〉打印前10行
硬连接:利用Linux为每个文件分配的物理编号(inode)建立连接。但是不能跨越系统
软连接:利用文件路径名进行连接
查看inode号 ls -i 〈文件名〉
创建硬连接ln 〈文件名〉 〈硬连接名〉
创建软链接ln -s 〈文件名〉 〈软链接名〉
通过链接文件可以操作原文件内容
文件搜索相关命令
find〈目录〉-name〈字符串〉查找含有字符串的所有文件;-iname〈字符串〉忽略大小写查找含有字符串的文件;-type x查找x类型的文件;-exec 〈指令〉对符合条件的文件执行指令
find -type f代表普通文件l代表链接文件
寻找条件可以用逻辑运算符。与-a,或-o,非 !
查找文件内容命令grep
egrep=grep -E支持更多正则表达式的grep
fgrep=grep -F不支持正则表达式的grep
rgrep=grep -R递归版本的grep
查找命令which 查找$PATH下的文件,主要是指令等
查找命令whereis 〈选项〉〈目录1〉〈目录2〉〈文件名〉在指定的目录1和目录2下查找文件
文件处理相关命令
取范围内数据命令cut
选项表
sed常用来对行操作
选项表
编辑功能:a追加;i插入;d删除;s替换;p打印
sed -i `1,$d` passwd(文件名)
awk对列操作
选项表
解压缩相关命令
归档:将一组文件或目录放到一个文件中。所占磁盘空间和整体文件一样大
压缩:将一组文件或目录放到一个文件中,并按照某种存储格式存到磁盘上。所占磁盘空间比整体文件要小
gzip 〈文件名〉将文件压缩成.gz文件,gunzip〈压缩包名〉解压
优点:移植性好。缺点:没有归档功能一次只能压缩一个文件
bzip2〈文件名〉将文件压缩成.bz2文件。bunzip2〈压缩包名〉解压
优点,性能上优于gzip,压缩比率大
zip〈压缩包名〉〈文件名〉生成.zip文件。 unzip〈压缩包名〉解压
优点:可以压缩目录且保留原文件,方便window和Linux两种系统进行文件交换
tar功能最全的压缩命令
选项表
生成tar文件 tar -cf〈压缩包名.tar〉〈文件名〉
生成.tar.bz2文件 tar -cjf 〈压缩包名.tar.bz2〉 〈文件名〉
生成.tar.gz文件 tar -czf 〈压缩包名.tar.gz〉 〈文件名〉
解压缩tar文件 tar -xvf 〈压缩包名.tar〉
解压.tar.bz2文件tar -xvjf 〈压缩包名.tar.bz2〉
解压.tar.gz文件 tar -xvzf 〈压缩包名.tar.gz〉
5 shell脚本编程(进程管理,用户管理)
进程管理相关命令
进程是一个执行的程序。是一个实体,有具体的地址空间。一般包括文本区域,堆栈区域,数据区域
查看进程指令 ps -elf展示父进程;-aux
查看实时进程指令 top。退出按q
树状图显示进程 pstree
进程的唯一标识 PID。PPID-父进程
发送信号命令 kill -l查看所有信号;-〈信号〉〈PID号〉
杀死进程的信号是9,如kill 9 ./a.out
用户管理相关命令
用户属性:用户名,口令,UID,用户主目录,用户shell
用户信息在/etc/passwd中
查看用户grep bash /etc/passwd
Unix组的信息在/etc/group
添加用户sudo adduser 〈用户名〉
修改密码 sudo passwd 〈用户名〉
查看组 id 〈用户名〉
修改组 sudo usermod -G 〈目标组的用户名〉 〈被修改组的用户名〉
修改家目录 sudo usermod -d 〈修改后的家目录名〉-m 〈被修改的家目录名〉
修改用户名sudo usermod -l〈修改后的用户名〉-m 〈被修改的用户名〉
删除用户和对应的家目录 sudo deluser --remove -home 〈用户名〉
6 shell脚本编程(概念,变量,语句)
shell 脚本
定义:利用shell功能写的程序,将shell语法和命令,搭配管道,数据流重定向,正则表达式等功能
编写步骤:1。需求分析 2。命令测试 3。脚本编写 4。测试调优
编写shell程序:1声明用的那个shell。如:#!/bin/bash
注释用 #
shell脚本变量
部分变量是系统设定好的
命名要求:1区分大小写,2 不能使用系统保留字和内置变量,3 只能使用数字字母和下划线,且不能数字开头,4使用英文尽量通俗易懂
变量分类:1 自定义变量,2特殊变量(环境变量,只读变量,位置变量,预定义变量)
shell脚本里需要变量直接定义就行,如a=1
注意=前后不能有空格!!
释放变量 ubset 〈变量名〉
取值用 $〈变量名〉和“$〈变量名〉”可以取出变量的值
‘$〈变量名〉’只能打印出$〈变量名〉本身的字符;
反撇号,提取命令输出结果a='echo 3',a就等于3了
用户自定义数组 a=(1 2 3 4)
精准控制打印数组第1个到第3个元素 echo ${a[@]:1:3}
只读变量 变量前+readonly。只读变量不能修改,不能用unset删除
位置变量和预定义变量表
常用环境变量表
shell语句
shell语句分为3类:说明性语句(注释),功能性语句,结构性语句
read a,从标准输入读取值到变量a
read 读取多个值时用空格隔开
read -p“〈字符〉”。-p增加提示字符。-t 〈时间值〉等待时间后自动结束读取。-s输入不显示
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
算数运算符前后要有空格!!
乘法符号要转义 \*,加减除不用
test语句可测试三种对象:
字符串 整数 文件属性
字符串相关处理
整数测试表
文件测试命令表
测试条件成立返回0,失败返回1
7 shell脚本编程(分支和循环语句)
分支语句
if 〈表达式〉 then〈语句〉else〈语句〉fi
if 〈表达式〉 then〈语句〉elif〈表达式〉then〈语句〉fi
if要是用[]括号内前后要有空格[ 〈条件〉 ]
多路分支语句
case 〈字符变量〉 in 〈命令〉 〈模式1〉) ;;〈模式2〉 | 〈模式3〉) ;; esac
最后一个;;可以省略。
也有用*代表剩下的所有选项
exit直接结束脚本
if [ $val -gt 100 -o $val -lt 0 ]等价于if [ $val -gt 100 ] || [ $val -lt 0 ]
循环语句
for 〈变量〉 in 〈表〉 do done把〈表〉中的内容依次付给〈变量〉。
for file in 1 2 3 4 5等价于for((file = 1;file < 6;file = file+1))
while 〈命令〉 do 〈命令表〉 done
while[]等价于while(())
break跳出循环和continue跳出本次循环
8 shell函数
function 〈函数名〉(){〈语句块〉return 〈返回值〉}
获取函数返回值调用方式,1 用变量接收函数值:把函数内打印到标准输出的值赋给变量了。 2 函数名 echo $?,打印的返回值
无论变量在哪定义默认是全局变量
定义局部变量 local
9 TFTP服务器搭建及使用
TFTP服务器
TFTP(简单文件传输协议)定义:是TCP/IP协议族中用来在客户机和服务器中进行简单文件传输的协议。端口号69
特点
TFTP服务器搭建
在线安装sudo apt-get install tfrpd-hpa(服务器)tftp-hpa(客户端)
配置sudo vi /etc/default/tftpd-hpa
创建tftpboot目录
配置介绍
重新加载 sudo service tftp-hpa restart
通过rftp下载文件。1 进入TFTP服务器tftp localhost ; 2 get 〈文件名〉;
上传文件:1 进入TFTP服务器tftp localhost; 2 put〈文件名〉;
常见错误表
10 NFS服务器搭建及使用
NFS服务器
NFS(网络文件系统)定义基于UDP/IP使用NFS能够在不同计算机之间通过网络进行文件共享,能使使用者在访问网络上其他计算机的文件时就像访问自己计算机一样
特点:1高性能,灵活配置;2提供透明文件访问和文件传输;3容易扩充新资源或软件,不需要改变环境
10.2 NFS服务器搭建
安装NFS:sudo apt-get install nfc-kernel-sever
修改配置:sudo vi /etc/exprorts
常见错误
11 结构体及结构体数组
结构体概述
结构体定义:由一批数组组合而成的结构体类型。组成结构体数据的每个数据称为结构体数据的成员。描述了一块内存的大小和解释意义
结构:struct 〈结构体名〉{ 〈成员列表〉 };
使用方式:1 struct 〈结构体名〉 〈变量名〉 2 struct 〈结构体名〉 〈变量名〉={成员1值,成员2值} 3 定义结构体时顺便定义变量
结构体数组
语法:struct 〈结构体名〉 〈变量名〉[〈元素个数〉] ={{},{},{},…}
12 结构体指针
作用:通过指针去访问结构体中的成员
语法:struct 〈结构体名〉 *〈指针名〉
通过->来访问结构体成员
声明结构体指针时一定要赋值,否则是野指针
13 结构体嵌套、大小及域位
结构体嵌套结构体
语法struct 〈结构体名〉 {struct 〈结构体名〉〈成员〉};
结构体大小
字节对齐:主要针对结构体而言,通常编译器会对其成员进行数据对齐以提高数据的读写效率
字节对齐作用:1。平台原因(移植原因),2。性能原因
结构体大小计算方法:自身对齐,默认对齐,有效对齐
计算结构体 struct A{char a;double b;char c;char d}占用的地址
地址必须要能整除有效地址才可以,所以a占了2个字节。最后必须是最大有效地址的倍数,所以d占了4个字节
在GNU GCC编译器中,遵循的准则有些区别,对齐模数不是像上面所述的那样,根据最宽的基本数据类型来定。在GCC中,对齐模数的准则是:对齐模数最大只能是4,也就是说,即使结构体中有double类型,对齐模数还是4,所以对齐模数只能是1,2,4。
位域
定义:把一个字节的二进制位分成几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允许程序中按域名操作
语法: struct 〈位域结构体名〉{〈类型说明符〉〈位域名〉:〈位域长度〉…};
14 C语言共同体和枚举
共同体概述
概述:不同数据类型的数据共用的存储区域,这种数据构造类型成共同体,又称联合体
共同体和结构体用法相同,只是存储区域不同
语法:Union 〈共同体名〉{共同体成员列表};
共同体大小
共同体占用空间为成员内最大字节数
注意字节补齐。所占的存储空间必须是成员类型的整数倍
枚举概述
定义:C语言的构造类型之一。在开发中一些变量只有几种可能是取值。枚举可以把所有可能列出来。默认从0开始递增。没有值则按照默认或者前一个值+1,有赋值优先赋值的值
语法:enum 〈枚举名〉{〈枚举成员列表,〉};
同一个程序中不同枚举类型的成员名不能重复
typedef关键字
作用:typedef是为计算机中复杂的声明定义简单的别名。可以是内部数据类型也可以是自定义数据类型
意义:简化一些比较复杂的声明。给变量一个易记且有意义的名字
语法 typedef 〈已有的数据类型〉〈新数据类型〉;
typedef struct A{}a,* a_p;其中a等价于struct A。a_p等价于struct A *
typedef与define的区别
1.执行时间不同:#define 是在预处理阶段,也就是在编译之前typedef是在编译阶段。2.作用域不同:#define无论在哪定义过,在其他地方都可以使用。typedef只能在定义的作用域内使用。 3.功能不同:typedef用来定义类型的别名,可以定义与平台无关的数据类型,可与struct结合使用。#define 虽然只是简单的替换,但是也可为为类型取别名,还可以定义常量、变量、编译开关等。 4.对指针的操作不同:typedef取别名的指针,前加const之后,指针不可更改,但是指针指向的内容可以更改,且一次能定义多个指针。#define取别名的指针,前加const之后,指针可以更改,但是指针指向的内容不能更改,且一次只能定义一个指针。
15 内存管理
意义:不同的区域存放数据,赋予不同的生命周期,带来更大的灵活编程
内存分区:代码区,全局区,堆区,栈区
代码区:存放函数体的二进制代码,由操作系统进行管理(CPU执行的机械指令,共享只读)
全局区:存放全局变量和静态变量以及常量(包含const)
堆区:编译器自动分配释放,存放函数的参数值,局部变量
栈区:由程序员分配释放,不释放程序结束由操作系统回收
查看占用多少内存的命令size 〈a.out〉
当全局变量和局部变量同名时,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。
16 动态内存使用
申请动态内存函数void *malloc(size_t size) 头文件:〈stdlib.h〉
释放空间函数void free(void *ptr) 头文件:〈stdlib.h〉
一个申请对应一个释放。不能多或少
内存泄露:申请的空间使用完没有释放
内存溢出:申请的空间小于数据所需要的空间
17 条件编译
gcc编译器
简介:gcc原GNU c语言编译器,后扩展可以编译多种语言。gcc被认为是跨平台编译的标准。提供了3个警告级别和30多条警告
gcc编译过程
gcc编译工具
常用选项:-c只编译, -o另命名, -g 产生调试信息,-O优化,-O2更高级的优化,-I添加目录,-l〈库名〉链接库,-L指定库的路径
创建线程 pthread_create();链接库 -lpthread
条件编译
概念:为了方便程序优化希望只对部分程序进行编译,让编译器只编译满足要求的代码
宏定义则编译:#ifdef 〈宏〉 #else #endif 没定义则编译#ifndef 〈宏〉 #else #endif
根据宏的值编辑#if 1 #else #endif
18 GDB调试
GDB调试工具
定义:GNU开源组织发布的在Linux下的调试工具
基本命令 gdb 〈函数名或者行号〉
l打印程序
b main 在main行打断点
r 运行起来
n 一步一步执行
p 〈变量名〉打印变量当前值
s 进入函数
调试段错误:再出现段错误后会生成core文件。gdb a.out core
调试运行的程序:1 查看pid多少。ps aux | grep a.out; 2 然后开始调试 gdb a.out -p 〈PID号〉
19 makefile用法及变量(自定义变量,自动变量,隐含变量)
意义:具备完成大型工程能力
概述:make是一个命令工具,是一个解释meifile中指令的命令。完成makefile后可以进行自动编译。第二次make只编译修改的文件
基本语法: target(目标):prerequisite(依赖) 〈tab〉command(命令)
实现只编译修改后的文件功能,要使用两步编译即.c→.o→.exe
解决目标名称和文件名重复问题 :.PHONY:clean
makefile自定义变量
目的:用来代替文本字符串
自定义变量 x = 1 。取值$(x)或者${x}
赋值方式
makefile自动变量
自动变量表
makefile的隐含变量
D20 makefile条件判断及函数使用
makefile的条件判断
语法:如果为真则执行。ifeq (($ARCH),x86) CC=gcc else endif
如果为假则执行。ifneq (($ARCH),x86) else CC=gcc endif
如果定义了则执行。ifdef ARCH CC=gcc else endif
如果没定义则执行ifdef ARCH else CC=gcc endif
makefile的函数
语法:$(〈function〉〈argument〉)或者${〈function〉〈argument〉}
$(wildcard PATTERN)
$(patsubst <pattern>,<replacement>,<text>)
21 make的使用及练习
make的使用