Linux软件编程
1. Linux:
操作系统的内核:
1. 管理CPU
2. 管理内存
3. 管理硬件设备
4. 管理文件系统
5. 任务调度
2. Shell:
1. 保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互)
2. 命令解释器
3. Shell命令:
man手册(帮助手册)
1. 标准命令
2. 系统调用
3. 库函数
4. 设备说明
5. 文件格式
6. 娱乐
7. 杂项
8. 管理员命令
command [-options] arg1 arg2 ...
1. Shell基本命令:
1. ls
2. cd
3. touch/rm
4. mkdir/rmdir
5. cp
6. mv
2. 文件查看命令
1. cat:查看文件内容(字符)
ASCII文件(文件内容均是能在终端显示ASCII码字符)(.txt、.c文本文件)
二进制文件(文件内容不能够再终端显示,或者显示乱码)(图片、视频、压缩包)
2. od -c:以字符或ASCll码形式显示文件内容
od -c filename
3. head/tail:查看文件开头/末尾内容(默认10行)
-n 指定显示的行数
head/tail filename
head/tail -n 行数 filename
3. 文件查找命令:
1. find:查找一个文件的路径
通配符:
*:匹配任意长度字符的文件名
?:匹配一位长度任意字符的文件名
[]:匹配一位长度指定字符的文件名
[1,2,3,4] 指定字符1 2 3 4
[1-4] 指定字符 1 2 3 4
[^2] 指定除了2以外的字符
find 文件夹 -name 文件名
find . -name '*.txt'
find . -name '??.txt'
find . -name '[1,2,3,4][1,2,3,4].txt'
2. whereis:查找指定内容的路径
whereis 二进制程序名/软件名
3. grep:查找文件中内容
grep 'printf' /usr/include/stdio.h
4. 重定向:将原本要输出再终端的内容重定向到一个文件中
>> 追加重定向 在原来内容基础上追加新的内容
> 覆盖重定向 将原来的内容覆盖掉
ls > file.txt
ls >> file.txt
5. 管道:将前面命令的输出作为后续命令的输入
ps -ef | grep bash
6. 其余命令:
ps -f #查看进程信息
echo #在终端打印内容
du -k/-m #测试文件大小
练习:一条shell命令,将/usr/include/stdio.h文件后200行中与extern相关的内容记录到file.txt文件中
tail -n 200 /usr/include/stdio.h | grap extern > file.txt
7. 压缩解压命令:
文件名后缀为:.tar.gz .tar.bz2
1. 压缩命令:
tar -zcvf 压缩文件包名.tar.gz 文件夹
tar -jcvf 压缩文件包名.tar.bz2 文件夹
2. 解压命令:
tar -zxvf 压缩包文件包名.tar.gz
tar -jxvf 压缩包文件包名.tar.bz2
8. 让虚拟机上网
1. ifconfig:查看网卡信息
2. ping www.baidu.com 向百度发送信号
看是否可以接收如下类似信号,如果可以即已联网
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=51 time=32.7 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=51 time=32.7 ms
ifconfig #1. 查看网卡信息
ping www.baidu.com #2. 向百度发送信号
3. 将虚拟机设置为NAT模式:
NAT模式:Windows有网,Ubuntu就有网
桥接模式:Windows 和 Ubuntu 网络独立
1. 点击"虚拟机"
2. 点击"设置"
3. 点击"网络适配器"
4. 选择"NAT模式"
5.点击"确定"
4. 配置Ubuntu系统的IP地址为自动获取IP地址
1. 打开网卡配置文件
sudo vim /etc/network/interfaces
2. 修改文件内容为:
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
3. 保存退出
ESC
:wq
4. 重启网络服务
sudo /etc/init.d/networking restart
5. 测试与百度是否联通
ping www.baidu.com
9. apt-get工具集:
1.自动下载软件
2. 能够分析软件的依赖关系
1. 设置apt-get工具的源:
1. 让虚拟机上网
2. 在Ubuntu左侧找到"Ubuntu Software"
3. 在Ubuntu上方找到"Ubuntu Software" 右键选择"Software & Updates"
4. DownLoad Form 选择 "Others" -> "China" -> "mirrors.aliyun.com"
2. 执行命令
1. 清除旧源
sudo apt-get autoclean
2. 更新新源
sudo apt-get update
3. 重建软件源依赖关系
sudo apt-get install -f
4. 安装软件
sudo apt-get install wireshark #安装Wireshark软件
sudo apt-get install valgrind #安装valgrind内存泄露检测工具
5. 卸载软件
sudo apt-get remove 软件名
6. 查看是否安装成功
dpkg -l 软件名
7. 安装
sudo dpkg -i 软件包名.deb
IO:
1. IO输入输出,操作对象是文件
2. Linux文件类型
b | (block)块设备文件 | 按块扫描设备信息的文件存储设备 |
c | (character)字符设备文件 | 按字符扫描设备信息的文件 |
d | (directory)目录文件 | 存放文件 |
- | 普通文件 | 存放数据(图片、音视频、压缩包、文本文件) |
l | (link)链接文件 | 快捷方式 |
s | (socket)套接字文件 | 用来套接字通信 |
p | (pipe)管道文件 | 用来进程间通信 |
3. 普通文件:
1. ASCll文件
文件中所有的字符均为能够在终端上显示的字符(文本文件、程序.c)
2. 二进制文件
文件中存放数据的二进制形式(图片、音视频、压缩包)
注意:ASCII码文件是特殊的二进制文件
4. 标准IO、文件IO
标准IO是库函数
文件IO是系统调用
系统调用:功能强大,应对复杂场景不够灵活
库函数:针对系统调用的封装,使用方便灵活
标准IO可以在Windows或者Linux平台使用
文件IO只能在Linux系统平台使用
5. 标准IO
getchar putchar scanf printf gets puts -> 标准IO
#include <stdio.h>
fopen/fclose
fgetc/fputc
fgets/fputs
fscanf/fprintf
fread/fwrite
fseek/rewind/ftell
6. 从文件中读写数据的流程:
1. 打开文件 | 2. 读写文件 | 3. 关闭文件 |
fopen | fgetc/fputc | fclose |
fgets/fputs | ||
fscanf/fprintf | ||
fread/fwrite |
7. 函数接口
1. fopen
FILE *fopen(const char *pathname, const char *mode);
1. 功能:打开pathname对应的文件并与其建立一个文件流
2. 参数:
pathname:要打开文件路径的字符串
mode:
r | 只读 | 文件不存在报错,文件存在只读打开 |
r+ | 读写 | 文件不存在报错,文件存在读写打开 |
w | 只写 | 文件不存在创建,文件存在将文件内容清空,只写打开 |
w+ | 写读 | 文件不存在创建,文件存在将文件内容清空,写读打开 |
a | 追加只写 | 文件不存在创建,文件存在追加只写打开 |
a+ | 追加写读 | 文件不存在创建,文件存在追加写读打开 |
3. 返回值:
成功返回打开的文件流指针
失败返回NULL
2. fclose
int fclose(FILE *stream);
1. 功能:关闭文,释放文件流指针
2. 参数:
stream:文件流指针
3. 返回值:
成功返回0
失败返回EOF(-1)
8. 文件流
1. 具有方向性(读写)
2. 具有连续性
3. 具有顺序性
句柄:操作对象的一个抽象
valgrind --tool=memcheck --leak-check=full ./a.out #检测是否溢出
9. 特殊的三个流:
stdin | 标准输入流 | 从终端读取数据 |
stdout | 标准输出流 | 向终端打印数据 |
stderr | 标准出错流 | 向终端打印数据 |
getchar、scanf、gets 通过stdin来读取终端数据
putchar、printf、puts通过stdout来向终端输出数据
perror通过stderr来向终端输出数据
10. 标准IO缓存:
1. 全缓存 | 缓冲区大小4K | 缓存区满刷新 | 刷新条件: 1.缓存区存满刷新(全缓存大小:4096) | 与文件建立的缓存 |
2. 行缓存 | 缓冲区大小1K | 遇到\n刷新 | 刷新条件: 1.缓存区存满刷新(行缓存大小:1024) 2.遇到\n刷新 3.fflush函数强制刷新 4.程序结束/fclose刷新 | 与终端建立的缓存 stdin、stdout |
3. 不缓存 | 缓冲区大小0K | 直接刷新 | 人机交互、界面控制、出错处理 stderr |
4. setvbuf:
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
1. 功能:改变一个流的缓存类型
2. 参数:
stream:文件流指针
buf:指定缓存空间的首地址
mode:
_IONBF 不缓存
_IOLBF 行缓存
_IOFBF 全缓存
size:
设定缓存区的大小
3. 返回值:
成功返回0
失败返回非0
11. fputc
int fputc(int c, FILE *stream);
1. 功能:向流中写入一个字符
2. 参数:
c:写入字符的ASCII码值
stream:文件流指针
3. 返回值:
成功返回写入字符的ASCII码值
失败返回EOF
注意:
1. fputc只能写入一个字符,写入多个字符需要多次调用fputc
2. fputc只能写入字符
作业:
1.利用fputc向文件file.txt中写入字符串"hello world"
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char tmptbuffer[32] = {"Hello World"};
char *pstr = NULL;
fp = fopen("file.txt", "w");
if(fp == NULL)
{
perror("fopen failed");
return -1;
}
pstr = tmptbuffer;
while(*pstr != '\0')
{
fputc(*pstr, fp);
pstr++;
}
fclose(fp);
return 0;
}
2.搜索fgetc的功能,参数,返回值含义,实现读取文件中所有的内容并显示在界面上
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char ch = 0;
fp = fopen("file.txt", "r+");
if(fp == NULL)
{
return -1;
}
while((ch =fgetc(fp)) != EOF)
{
putchar(ch);
}
return 0;
}