岁月如梭,不知觉间来华清远见学习已经过了四十多天了,从最初的忐忑不安,不知道学不学得懂,掌不掌握得到,到如今的越来越有自信,越来越有把握完成来华清学习的最初的目标。
回顾一下到现在为止学习到的知识:从第一部分的C基础开始,一开始简单的介绍linux系统下的基本操作,比如在linux下一切皆文件,常用的命令:rm、cd、ls、pwd、mkdir、touch、mv、cp、cat等。
详情:
rm 命令
删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录。如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。
命令格式
rm [选项] 文件名
常用选项参数:-r, -R: 指示rm将参数中列出的全部目录和子目录均递归地删除
cd 命令
cd 路径
cd ../../ 进入当前目录的上一级的上一级目录
cd / 进入根目录
ls 命令
ls 命令不仅可以查看 linux 文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。
命令格式
ls [选项][目录名]
常用参数
- -l :列出长数据串,包含文件的属性与权限数据等
- -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
- -d :仅列出目录本身,而不是列出目录的文件数据
- -h :将文件容量以较易读的方式(GB,kB等)列出来
- -R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来
pwd 命令
查看"当前工作目录"的完整路径。
命令格式:
pwd [选项]
常用参数:
- -P :显示实际物理路径,而非使用连接(link)路径
- -L :当目录为连接路径时,显示连接路径
mkdir 命令
用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。
命令格式
mkdir [选项] 目录
mkdir test
touch 命令
touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。
命令格式
touch [选项] 文件
常用参数
- -a 或--time=atime或--time=access或--time=use 只更改存取时间
- -c 或--no-create 不建立任何文档
- -d 使用指定的日期时间,而非现在的时间
mv 命令
可以用来移动文件或者将文件改名(move (rename) files)。当第二个参数类型是文件时,mv命令完成文件重命名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
命令格式
mv [选项] 源文件或目录 目标文件或目录
mv test.txt test1.txt
mv test.txt ./test/
cp 命令
将源文件复制至目标文件,或将多个源文件复制至目标目录。
命令格式
cp [选项] 源文件 目录 或 cp [选项] -t 目录 源文件
cp test.txt test1.txt
cat 命令
用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。
cat [选项] 文件名
cat test.txt
再之后介绍vi编译器,常用操作:gg=G、a、i、o、:、gg、G、$、+num、p、dd、ndd、yy、nyy、wq、q!、w、x等。
命令行模式下:
gg=G : 标准化所有代码
a :在光标的后面插入
i:在光标当前位置插入
o:在光标的下一行插入
gg:跳到文章开头
G:跳到文章末尾
$:跳到光标所在行的末尾
vi 文件名 +数字:进入文件到指定行
dd:剪切光标所在行
ndd:剪切光标及之后一共n行
yy:复制光标所在行
nyy:复制光标及之后n行
尾行模式:
wq or x:保存并退出
q:退出
w:写
q!:强制退出
要记住这些常用操作命令只有多练习、多使用,用多了自然就可以掌握了。在C基础中,最让我头痛的无非就是指针,都说要学好C语言,最基本的就是熟练掌握指针了。在学习指针中,有个东西一直困扰了我很久,如一个整数类型的数组,指针p指向数组第一个元素,指针q指向数组第二个元素,那么q-p得到的是什么呢?这个问题让我踩了坑,咋一看两个都是指针,那么两个指针相减得到的是它的偏移量呀,但是,在程序运行时,q-p并不是直接两个地址相减,是在相减的基础上还要除以一个sizeof(数组类型),得到的是两者之间相差的元素个数。还有最大的困难几个就是指针数组、数组指针、函数指针、指针函数、指针函数指针。要想学好指针,首先要知道这个指针的类型是究竟什么,老师教了一种很简单就能识别的方法,就是右左右原则,
比如:char *p[10],变量p的右边是一个数组,所以p的本质是一个数组,再看p的左边,是char *类型的,说明这是一个指针数组,数组中的每个元素都是指向char类型数据的指针;
再比如:void *(*start_routine) (void *),本质是一个指针,指向的是一个指针函数,所以是指针函数指针;
在之后需要注意的是函数中的参数传递,分为值传递和地址传递,值传递不会改变实参的值,选好自己需要的类型是很重要的。
在第二阶段中,对于Linux下的包的管理,常用的是apt-get;
apt-get install packagename
安装一个新软件包
apt-get remove packagename
卸载一个已安装的软件包(保留配置文档)
apt-get update 更新软件包列表
apt-get upgrade 可以使用这条命令更新软件包
apt-cache: 用于查询软件包信息对于shell脚本,其本质是有序命令的集合,编写脚本文件,在脚本文件中也有其特定的语言格式,比如在每个.sh的文件开头都需要#!/bin/bash的申明,表示此文件是脚本文件;同时也存在循环、判断、参数、以及命令置换符:` `,只需要记住常用的语句格式;最后的工程管理非常重要,一个工程应该需要一个makefile文件来管理,使用makefile文件管理工程的好处是简化编译,同时在后期维护很方便。
第三阶段为数据结构与算法
在这个阶段学习了线性结构
线性表、链表、栈、队列
线性表:在物理和逻辑上都是连续的,且只有唯一后继和唯一前驱;对于表的操作:通常为增加、删除、修改、查询、判空、判满;链表:物理上不连续,逻辑上连续,链表又分为单链表、单向循环链表、双向链表、双向循环链表;栈:只在一端操作,先进后出;队列:一段插入、另一端删除,为了避免内存泄漏,需要构建循环队列,并且少使用一个存储空间,便于判断队空队满
非线性结构
树、二叉树、图
树:唯一前驱,多个后继,树根只有一个节点;二叉树:唯一前驱,最多有两个后继,二叉树的遍历有三种方式:先序遍历、中序遍历、后序遍历;知道两种遍历求另一种遍历的条件是必须知道中序遍历;运用坐标法。
第四阶段是文件IO,文件IO是系统调用,资源耗费大;标准IO为C库调用;
标准IO函数:
fopen、fclose、fwrite、fread、fgetc、fputc、fgets、fputs、fseek,这些函数都是对流指针操作
文件IO:
open、close、read、write、lseek,这些函数都是对文件描述符操作
目录操作函数:
opendir、readdir、closedir
文件信息函数:
stat、getpwuid、getgrgid
库的制作,
静态库
动态库
在之后是进线程,对于进程:
一个程序的执行过程,拥有唯一进程号,fork为创建进程,exit为结束进程,fork会返回一个进程id,id为0的是子进程,大于0的是父进程,wait(阻塞等待)和waitpid(可设置阻塞或者非阻塞)则是父进程回收子进程资源,如果不回收则会产生僵尸进程
exec函数簇
作用是在一个进程中启动另一个进程;守护进程:一直在后台运行,创建流程为:创建子进程,父进程退出,在子进程中创建新会话,修改工作目录,修改umask,关闭文件描述符(如默认打开的0、1、2)。线程:通常线程指的是共享相同虚拟地址空间的多个任务,使用多线程, 大大提高了任务切换的效率;需要注意的点:在使用共享对象时,需要考虑竞态,这时可考虑使用同步或者互斥机制。进程间通信的方式:无名管道、有名管道、信号、共享内存、消息队列、信号灯集、套接字。
第五阶段是网络编程,tcp/ip协议(tcp:解决数据传输问题,ip:解决不同网络间的连接),osi七层结构:
应用层(app)
表示层(数据加密解析)
会话层(建立逻辑名字和物理名字的联系)
传输层(确保数据传输,流量控制)
网络层(数据分组,选择路由)
数据链路层(将数据组装成可以发送的帧格式)
物理层(将数据转化成物理信号)
tcp/ip协议模型为四层结构:应用层、传输层、网络层、网络接口物理层。
Tcp:稳定可靠,有连接,无失序,数据流式;
udp:不稳定,无连接,有失序,数据报式。
服务器的创建步骤:
创建套接字(socket)
绑定套接字信息(bind 、 struct sockaddr_in addr)
监听套接字(listen)
被动等待连接(accept 阻塞)
客户端:
创建套接字(socket)
绑定(可选)
连接(connect)
客户端连接服务器的三次握手,断开连接的四次挥手;
实现并发服务器的方法:进程、线程、IO多路复用(select、poll、epoll)。
对于每个阶段的学习,都要即使复习和巩固,时间长了是会忘记的,要多加练习,并且要结合所学的所有知识,将所有阶段的东西结合起来,才能更加熟练的掌握。



