学习框架
一、IO编程
多任务编程(进程、线程)
网络编程
数据库编程
二、数据结构
学习笔记
Linux软件编程:
一. Linux
1、Linux: 操作系统的内核,真正的操作系统叫Ubuntu、Redhat、CentOS.....
内核(纯c实现的代码):管理CPU、内存、硬件设备、文件系统,进行任务调动
系统调用:Linux内核当中的函数
应用方向:1、服务器,2、嵌入式
2、Shell:
保护操作系统的内核(用户和Linux内核不直接操作)
命令解释器的作用
3、工作方式
用户——>shell——>内核——>硬件设备——>让用户看到现象
二、man手册(帮组手册)
1.标准命令
2.系统调用
3.库函数
4.设备说明
5.文件格式
6.娱乐
7.杂项
8.管理员命令
command [ -options ] arg1 arg2.....
三、Shell命令
1、shell基本命令:ls cd touch/rm mkdir/rmdir cp mv
2、通配符:
1)* :匹配任意长度任意字符的文件名
2)?:匹配一位长度任意字符 ?.h ???.h
3)[ ] : 匹配一位指定字符的文件名[1,2,3,4]指定字符1 2 3 4
3、文件查看命令:
1) cat:以字符的形式查看文件(cat+文件名)
ASCII 码文件(文件内容均是能在终端显示的ASCII码字符)
二进制文件(文件内容不能够在终端显示,或者显示乱码)
2)od -c:以字符或者ASCII码形式显示文件内容
示例:od -c filename
3)head / tail:查看文件开头(末尾)内容,默认10行
head -n 想看的前n行
示例:head filename
4、文件查找命令
1)find:查找一个文件在文件系统当中的路径
示例:find 文件夹 -name 文件名
可以搭配通配符使用
2)whereis:查找指定内容的路径
示例:whereis 二进制程序名 / 软件名
3)grep:查找文件中的内容
示例:grep 'printf' stdio.h
5、重定向:
将原本要输出内容重定向到在终端的一个文件里
>>:追加重定向——在原来内容的基础之上追加新的内容
> :覆盖重定向——将原来的内容覆盖掉
示例:
ls > file.txt
ls >> file.txt
6、管道
将前面命令 的输出作为后续命令的输入
示例:
ps -ef | grep bash
7、其余命令
ps-ef :查看进程信息
echo: 在终端上打印内容=printf
du: 测试文件大小(仅显示当层文件的大小,不包含下一层的文件)
du -k du -m 按kb和mb测试
练习:将/usr/include/stdio.h文件后200行中与extern相关的内容记录到file。txt文件中
8、压缩解压命令
1)压缩命令:
tar -zcvf 压缩文件包名.tar.gz 文件夹名
tar -jcvf 压缩文件包名.tar.bz2 文件夹名
2)解压命令:
tar -zxvf 压缩文件包名.tar.gz
tar -jxvf 压缩文件包名.tar.bz2
示例:
tar -zcvf dir.tar.gz dir
.........
9、让虚拟机上网:
1)ifconfig:查看网卡信息
2)ping:从主机向目的地址发送一个信息
3)将虚拟机设置为NAT模式
NAT模式:Windows有网,Ubuntu就有网
桥接模式:Windows,Ubuntu都会使用网卡(Windows和Ubuntu网络独立)
4)配置Ubuntu系统的IP地址为自动获取IP地址
1、sudo vim /etc/network/interfaces
打开网卡配置文件,设置为
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
2、重启网络服务
sudo /etc/init.d/networking restart
3、测试与百度是否连通
ping www.baidu.com
10、在虚拟机上下载软件
apt-get 工具集:
1)设置apt-get工具的源
设置software到“mirrors.aliyun.com”
2)执行命令
清楚旧源:sudo apt-get autoclean
更新新源:sudo apt-get update
重建软件园依赖工具:sudo apt-get install -f
安装软件:sudo apt-get install wireshark(安装wireshark)
sudo apt-get install valgrind(安装valgrind内存泄漏监测工具)
卸载软件:sudo apt-get remove 软件名
查看是否安装成功:dpkg -l 软件名
安装:sudo dpkg -i 软件包名
IO:
1、IO输入输出,操作对象是文件
2、Linux文件类型:
b:block 块设备文件(按块扫描设备信息的文件)
c:character 字符设备文件(按字符扫描设备信息的文件)
d:directory 目录文件(存放文件)
-: 普通文件(存放数据,图片,音频,压缩包,文本文件)
l:link 链接文件(快捷方式)
s:socket 套接字文件(用来套接字通信)
p:pipe 管道文件(用来进程间通信)
3、普通文件:
1)ASCII码文件
文件中所有字符均为能够在终端上显示的字符
文本文件、程序.c
2)二进制文件
文件中存放数据的二进制形式
图片、音视频、压缩包
ASCII码文件是特殊的二进制文件
4、标准IO、文件IO:
标准IO:库函数—针对系统调用的封装,使用方便灵活—Windows、Linux
文件IO:系统调用—功能强大,应用复杂场景不太灵活—Linux
5、标准IO:
getchar /putchar /scanf /printf /gets /puts ->标准IO
fopen / fclose
fgetc / fputc
fgets / fputs
fscanf / fprintf
fread / fwrite
fseek / rewind / ftell
6、从文件中读写数据的流程:
打开文件 -> 读写文件 -> 关闭文件
fopen fgetc / fputc fclose
fgets / fputs 字符串的读写
fscanf / fprintf 格式化字符串的读写
fread / fwrite 二进制文件的读写
7、函数接口:
1)fopen
FILE *fopen(const char *pathname, const char *mode);
功能:打开pathname对应的文件并与其建立一个流
参数:pathname:要打开文件路径的字符串
mode:
r:只读(文件不存在报错,文件存在只读打开)
r+:读写(文件不存在报错,文件存在读写打开)
w:只写(文件不存在创建文件、文件存在将文件内容清空,只写打开)
w+:写读(文件不存在创建文件、文件存在将文件内容清空,写读打开)
a:追加只写(文件不存在创建、文件存在追加只写打开)
a+:追加读写(文件不存在创建、文件存在追加写读打开)
返回值:
成功:返回打开的文件流指针
失败:返回NULL
例:
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
fp = fopen("a.txt","w+");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
printf("fopen sucess!\n");
return 0;
}
2)fclose(具有free的功能)
int fclose(FILE *stream);
功能:关闭文件,释放文件流指针
参数:stream文件流指针
返回值:成功返回0;失败返回EOF(-1)
注意:
一个程序只能 fclose 一次
fopen 要和 fclose 成对打开
8、流:
1)具有方向性(读写)
2)具有连续性
3)具有顺序性
句柄:操作对象的一个抽象
valgrind -- tool=memcheck --leak-chech=full ./a.out
9、特殊的三个流:
stdin 标准输入流(从终端读取数据)
stdout 标准输出流(往终端打印数据)
stderr 标准出错流(往终端打印数据)
getchar 、scanf、gets 都是依赖于stdin来使用
未关闭:
#include<stdio.h>
int main(void)
{
//fclose(stdin);
//fclose(stdout);
//fclose(stderr);
getchar();
printf("hello world!\n");
perror("hello world!\n");
return 0;
}
已关闭:
#include<stdio.h>
int main(void)
{
fclose(stdin);
fclose(stdout);
fclose(stderr);
getchar();
printf("hello world!\n");
perror("hello world!\n");
return 0;
}
10、标准IO缓存(读写的时候才会有缓存)
缓存分为三类:
1)全缓存(缓存区满刷新),一般与文件建立的缓存
①缓存区存满刷新(全缓存大小:4096_4k)
②fflush函数强制刷新
③程序结束刷新
2)行缓存(遇到 \n 刷新),一般与终端建立的缓存 (stdin、stdout)
①缓存区存满刷新(行缓存大小:1024_1k)
②遇到 \n 刷新
③fflush函数强制刷新
④程序结束刷新 / fclose刷新
3)不缓存(stderr)多用于人机交互、界面控制、出错处理
直接刷新(0k)
4)setvbuf修改缓存
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
功能:
改变一个流的缓存类型
参数:
stream:文件流指针
buf:指定缓存空间的首地址
mode:
_IONBF 不缓存
_IOLBF 行缓存
_IOFBF 全缓存
size:
设定缓存区的大小
返回值:
成功返回0
失败返回非0
11、fputc
int fputc(int c, FILE *stream);
功能:
向流中写入一个字符
参数:
c:写入字符的ASCII码值
stream:文件流指针
返回值:
成功返回写入字符的ASCII码值
失败返回EOF
注意:
fputc只能写入一个字符,写入多个字符需要多次调用