Linux C高级
【0】 自我介绍: 浦 课堂氛围: 无代沟 有问题直接说 多尝试
【1】 授课任务 5-6天
1. Linux系统命令 补充 全面
2. shell脚本 和C一致是个独立的语言 稍微有难度(C逻辑)规矩
3. C高级 - 学生管理系统 强化结构体
4. makefile (读懂) GDB(调试)
【2】 怎么学习LinuxC高级
1.写笔记 dpkg -i -s -P
2.加强记忆
3.笔试占的比例比较大
【1】什么是嵌入式? 你自己的理解 感悟
(软硬结合 -- 举例子 手机 冰箱 智能家居 小度小度 小爱同学 无人分拣 北京无人驾驶租出车 自动送餐机器人)
可裁剪 系统 移动便携? 传感器
以计算机应用为中心,软硬件可裁剪,专用计算机系统(通用计算机系统Windows)
对功耗 体积 成本 可靠性有特定要求
操作系统 --- 内核
Windows --- NT内核
Ubuntu --- Linux内核
MacOS ---- Unix
Android -- Linux
ios --- Unix
为什么会使用Linux? --- 开源 可裁剪 移植性好 支持硬件众多
硬件裁剪 -- 不要什么了就在画PCB的时候去掉
软件裁剪 -- 对应的程序就不写
【2】Linux系统由来
1965 - Multics计划 可以同时登陆300人 - 失败了
1969 - 贝尔实验室(汤姆森肯 四周)unics
1973 - C语言风格 Unix(收费) -- 大学里面推广(SystemV 伯克利分校(TCP/IP))
1984 - 理查德 自由软件 -- GNU (GNU is not Unix)-- 遵循GPL协议(开源保护协议)
bash(终端解析器) glibc库(C库 - printf scanf)
1991 - Linus - Linux开源不收费 (不对个人收费 面向企业收费)
高德地图: 如果高德不写 淘宝就得自己开发
* Linux系统: 把这个Linux内核编译出来的就叫Linux系统
linux内核: 一段代码
1. 查看内核版本的命令
uname -r
cat /proc/version
3.2.0-29-generic-pae
主版本号.次版本号.修订次数 - 编译次数 - 内核描述信息
2. 查看Ubuntu版本
cat /etc/issue
sudo lsb_release -a
3. Linux系统
Ubuntu: 更新及时 用户体验感 人道主义 桌面性能优越 有Windows有界面交互
Redhat: 服务器上面 更新速度不快 所以很稳定
4. 面试题: Linux和Unix的区别
1)linux开源代码 自由软件 Unix是商业
2)Unix基本都是硬件配套的 Linux可以运行在多种硬件平台上面
* 使用Unix的环境: 银行 电信 民航 固定型的Unix机
【3】 Linux系统组成
应用层 {glibc}
APP APP 命令 shell脚本
| |
| 命令解析器
| |
可以直接操作内核 | 【0-3G】
-----------------------------------------------------
内核层 五大功能: 【3-4G】
1. 进程管理
什么是进程: 进程是程序的一次执行过程 (程序是静态的 进程是动态的)
CPU面向的对象是进程 对进程进行调度
* 买手机买电脑买几核的? -- 几个核?
几个核相当于有几个CPU: CPU1-QQ CPU2-wechat CPU3-tim CPU4-nodepad++
时间片轮询 -- 系统进程的调度
2. 文件管理 -- 文件管理系统
/bin 系统常用的可执行文件 二进制文件
/boot 和Linux相关的启动文件
/dev 设备文件 鼠标 键盘 USB
/lib 共享文件
/mnt 通常会作为挂载点
/home 用户主目录的默认位置
/etc 配置文件 passwd(文件里写的是用户的信息)
3. 内存管理 -- 申请和释放malloc
4. 设备管理 -- 设备驱动
5. 网络管理 -- TCP UDP套接字 socket编程
---------------------------------------------------------
硬件层 : 鼠标 显示器 USB
【4】 0-4G内存分配
1. 0-3G有什么区
堆 - heap malloc出来 先进先出
栈 - stack 满减栈(地址越用越向下 程序执行完出栈 都在栈顶)先进后出
静态区
.data 已经初始化
.bss 为初始化 一堆0
.ro readonly 只读数据段 字符串常量“hello world”
.text 你写的代码
2. MMU内存映射
一个a.out 2k左右 存在在真实的物理内存上
3. 1G物理内存满了怎么办? 硬盘保存 swap交换分区(速度慢)
提问练习:
1. char *p = "hello world" - 只读数据段
*p = "haaaaa" -- 不行 字符常量不能改
p++ -- 行 栈上 栈可以加减
2. const作用:
常量化(只读修饰)
const int *a a是一个指向整型数的指针 整数不可以修改 指针可以修改
int * const a a是一个指向整数类型的常指针 指针指向的整型数是可以修改的 指针不可以修改
3. 被const修饰过的全局变量放在哪里?
全局变量放在静态存储区
const修饰的局部变量在栈上
【5】 三个模式:
NAT 对外公用的是一个IP地址 可以访问外网
仅主机 Ubuntu和Windows通信 不可以访问外网
桥接 Ubuntu和Windows是两个独立的IP 但是都可以访问外网
连不上外网怎么办
A. 编辑 - 虚拟网络编辑器 - 还原默认设置
B. 虚拟机 - 设置 - 网络适配器 - 根据需求选择一个
C. 右上角的网络箭头 - 删除已有的 - ADD - SAVE添加一个新的
D. 重启你的虚拟机
E. 安装虚拟机的时候 防火墙? 杀毒软件? 安装纯英文目录? 右键以管理员身份运行?
【6】 Linux系统命令 - 安装软件相关apt-get dpkg
1. 常见的软件包后缀
Windows .exe Andriod .apk
Ubuntu .deb redhat .rpm
2. 软件包名组成
sl _3.03 -16 _i386 .deb
软件名 主版本号 次版本号 架构(X86-32位 X64-64位) 后缀
3. 安装命令 只有两个
apt-get : 在线安装 需要依赖网络 安装的时候会将依赖的包一起安装上
dpkg : 离线安装 没有网络 不依赖网络 不检查依赖
* 在软件包出现之前 怎么安装?
ls放在那里? /bin
file ls
file a.out
ls和a.out都是一段可执行程序
./a.out ./表示当前目录 将a.out拷贝到/bin目录下就可以在任意目录下执行
4. 安装 sudo dpkg -i sl_3.03-16_i386.deb (install 一定要打全名)
执行 直接输入软件名 sl 可以使用man手册查看选项参数
卸载 sudo dpkg -r sl (remove 直接写软件名)
查看状态 sudo dpkg -s sl (state)
查看版本 sudo dpkg -l sl (list)
查看软件包中各个文件的安装信息 sudo dpkg -L sl
完全删除(包括删除配置文件)sudo dpkg -P sl
练习: 如何查看Ubuntu上已经安装的所有的软件
sudo dpkg -l
如果目录下面有五个安装包想要一把安装怎么办?
sudo dpkg -i *.deb
* 换源(文件) :
1. update manager -- setting -- download from
2. 源文件所在: vim /etc/apt/sources.list
3. 换源就是指把这个文件换掉
5. 在线安装 apt-get
安装 sudo apt-get install sl
现将软件下载到本地 - 再把软件包安装 - 那么软件包在哪?
cd /var/cache/apt/archives/
sudo apt-get install sl 小火车
sudo apt-get install xawtv 摄像头
sudo apt-get install oneko 小猫
sudo apt-get install frozen-bubble 泡泡龙
sudo apt-get install cmatrix 屏保
sudo apt-get install cowsay 奶牛说
sudo apt-get install bastet 俄罗斯方块
如果由于故障或者网络原因导致中断了安装,用户既不能重装也不能删除?
1. 检查依赖源: sudo apt-get check
2. 修复: sudo apt-get -f install
cd /var/lib/apt/lists 本地和服务器地址不同
sudo rm * -rf
sudo apt-get update
卸载 sudo apt-get remove sl
清除目录下的软件包 sudo apt-get clean
/var/cache/apt/archives/
只下载不安装 sudo apt-get download 软件名
下载源码 sudo apt-get source 软件名
用apt-get安装的软件可以用dpkg卸载
6. 关机和重启命令
sudo reboot 重启
sudo shutdown -h now : 立即关机
sudo shutdown -r now : 立即重启
sudo shutdown -h +10 "byebye" :定时十分钟后关机
sudo shutdown -r +10 "byebye" :定时十分钟后重启
7. Vim编辑器
图形模式的编辑工具gedit
文本模式的编辑工具 nano (ctrl + x)
vim输入的三种模式
命令行模式: YY 3DD P
底行模式: :wq :q! :w+文件名 :vsp
插入模式: i o a
【7】shell简介(shell命令)
1. shell是一个命令行解析器,把用户的命令解析成系统能理解的指令,实现用户和系统的交互
2. sh->sh->ksh->bash
3. shell命令的格式
command [-options] arg1 arg2...
命令 选项 参数
* 三者之间空格隔开
如果想要多个命令同一行书写要;隔开
如果命令在一行不能写完的时候 用\表明未结束
【8】 1.查看历史记录 history 显示历史记录的大小echo $HISTSIZE
2.通配符
[..] :匹配其中指定一个字符
[ - ]:匹配一个指定字符的范围
[^..]:除了其中指定的字符 其他的都可以匹配
touch a.c b.c c.c 1.c 2.c aa.c bb.c cc.c
ls [ab].c --- a.c b.c
ls [a-c].c --- a.c b.c c.c
ls [^a-c].c --- 1.c 2.c
3.管道 | 前一条命令的输出作为后一条命令的输入
ls | wc -w
wc -w 文件名 : 显示单词的个数
wc -l 文件名 : 显示文件的行数
wc -c 文件名 : 显示字符数
4. grep : 过滤
grep "int" test.c 查找文件中的int
5. cat: 显示文件内容
cat test.c | grep int
6. 输入输出重定向
将终端输出的内容重定向到一个文件
ifconfig > ip.txt 以新建的方式重定向
ifconfig >> ip.txt 以追加的方式重定向
< :将文件作为输入源
7. 命令置换 `` 讲一个命令的输出作为一个命令的参数
echo "user is `whoami`"
8. echo 回显 回声
9. date 获取系统时间日期
10. Ctrl+L清屏 system("clear")
【9】 shell中的用户管理
1. sudo adduser 用户名 : 添加用户
[sudo] password for linux:
Adding user `lala' ... // 添加用户
Adding new group `lala' (1001) ... // 添加用户组
Adding new user `lala' (1002) with group `lala' ...
Creating home directory `/home/lala' ... //创建家目录
Copying files from `/etc/skel' ... //拷贝模板文件
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for lala
Enter the new value, or press ENTER for the default
Full Name []: LA
Room Number []: 12
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
*新建的用户没有sudo权限怎么办
[sudo] password for lala:
lala is not in the sudoers file. This incident will be reported.
su root
cd /etc
chmod 777 sudoers
照着root修改 root ALL= (ALL:ALL) ALL
chmod 440 sudoers
su lala --- > sudo命令可用
2. su 切换用户
cat /etc/passwd :保存用户信息
cat /etc/shadow : 保存密码的文件
cat /etc/group : 保存组的信息文件
cat /etc/skel : 模板目录