一到五章
一到五章是基础语法知识和一些基本的函数的用法,如果有其他语言的使用经验,可以略过,需要的时候 Google 一下就行了。
这本书的代码我觉得写得不够好,很多地方都不规范,比如 main 不声明类型,不返回 0,extern 不声明类型等等。大家主要用来看看有哪些 linux 编程需要的函数。
下面都不说具体用法,因为这个东西一查就有了。
第六章笔记我写的不太好,我觉得读书重在理解概念、机制,这些工具函数用到再查也好,所以后面我改进了。
第六章 文件
本章讲的是文件的操作
最基本的
- creat - 创建
- open - 打开
- read - 读取
- write - 写入
- close - 关闭
这几个的作用就是英文字面意思。
而 lseek 的作用是移动读取文件的指针。
read 和 lseek 配合使用。l
表示的是 long (参考 https://softwareengineering.stackexchange.com/questions/244525/why-is-the-function-called-lseek-not-seek)
dup
- dup - (duplicate)给
file descriptor
创建别名 - dup2 - 和 dup 类似,但是可以指定 id。
这两个基本初学者用不到,但是它们是有用的,比如 shell 输入输出重定向、进程间通信。可参考:
http://www.runoob.com/linux/linux-shell-io-redirections.html 和 http://mark-shih.blogspot.com/2011/01/dup-dup2.html
两个 c (n) tl
- fcntl - 操作普通文件。估计是 file control 的缩写。恕我直言,C 语言的缩写挺烦的,虽然打字方便了,但是大大降低了可读性,后来发明的更高级语言很少这么干。具体用法见:http://man7.org/linux/man-pages/man2/fcntl.2.html
- ioctl - 操作设备文件。你看,前面 control 用 cntl,这里又用 ctl,这样简直是乱来。具体用法见:http://man7.org/linux/man-pages/man2/ioctl.2.html 这个函数比较实用,可以获取设备信息,比如 IP 地址
stat, fstat, lstat, fstatat - 获取文件状态
作用是获取文件创建日期、大小、所有者之类的状态(Windows 上叫做属性)。
详见 http://man7.org/linux/man-pages/man2/stat.2.html
ch (ange) 系列 - 修改文件状态
- chmod, fchmod, fchmodat - 改变权限。详见:http://man7.org/linux/man-pages/man2/chmod.2.html
- chown, fchown, lchown, fchownat - 改变所有权。详见:http://man7.org/linux/man-pages/man2/chown.2.html
truncate
- truncate, ftruncate - 改变文件大小。truncate 这个单词意思是截短。详见: http://man7.org/linux/man-pages/man2/ftruncate.2.html
u 系列
- utime, utimes - 改变文件修改时间、最后访问时间。
- umask - 设置新建文件权限的掩码,比如 0777.
文件
- rename - 重命名、移动。
- remove - 删除文件、目录。本质是 unlink。
- unlink - 删除文件。
目录
- mkdir - 创建目录
- rmdir - 删除目录
- getcwd - 获取当前目录
- chdir - 设置工作目录。(什么是工作目录:https://www.cnblogs.com/nielong/p/5549422.html)
- opendir - 打开目录
- readdir - 读取目录信息
- closedir - 关闭打开的目录
第七章 进程
进程的状态分为:
- R running or runnable (on run queue)
- D uninterruptible sleep (usually IO)
- S interruptible sleep (waiting for an event to complete)
- Z defunct/zombie, terminated but not reaped by its parent
- T stopped, either by a job control signal or because it is being traced
记忆口诀(我自己想的):燃烧的猪蹄(RSDZT)
进程的操作可以用到再查。
第八章 线程
操作系统通过快速轮流执行几个程序,这样就会产生几个程序同时进行的假象。线程的作用就是这样。(不过如果是多核运行,可能会有所优化)
线程的基本操作此处略。
互斥锁
作用:互斥锁的作用是对临界区加以保护,以使任意时刻只有一个线程能够执行临界区的代码。实现了多线程之间的互斥。临界区就是代码片段。(https://blog.csdn.net/qq_33951180/article/details/72801228)
参考:
- 知乎上的。不过感觉讲得不是太通俗易懂。https://www.zhihu.com/question/39850927
异步信号
什么是异步?
同步:一定要等任务执行完了,得到结果,才执行下一个任务。
异步:不等任务执行完,直接执行下一个任务。
(https://zhuanlan.zhihu.com/p/22685960)
异步信号的作用:进程间异步通信方式。
异步通信又是什么:异步通信中的接收方可以不知道数据什么时候会到达。
举个例子:你打字的时候,如果是同步的方式,则电脑没有处理完一个按键就不能处理下一个按键,也就是你要等他(电脑)。而若是异步方式,则你可以随便打,它只管自己接收你的输入然后一一处理,你不用等他。
参考:
- 通俗理解同步通信与异步通信 https://blog.csdn.net/RhythmWANG/article/details/68066584
- Linux 异步之信号 (signal) 机制分析 https://blog.csdn.net/freeking101/article/details/78338497
- 什么是阻塞,非阻塞,同步,异步?https://www.zhihu.com/question/26393784
第九章 信号
信号可以理解为信件。信号的作用:给其他进程发信息,当然你也会收到其他进程的信息。
信号处理的具体代码略,用到再查。
第十章 进程间通信
管道方式
特点:1. 单向。2. 亲缘性。(不是父子或兄弟进程不能通信)。具体代码略。
消息队列
这个可以理解为你的电子邮箱的信件列表。具体代码略。
信号量
表示资源可用量。信号量(Semaphore)不是信号(Signal)。最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。(https://blog.csdn.net/ljianhui/article/details/10243617)
信号量就是一个停车场。当前值是停车场里还剩下多少个空车位。最大值是停车场里最多能容纳多少个车位。
当汽车进入停车场时,首先要在门口排队(sem_wait),得到进入许可后才能进入。
排队顺序原则上先到先得。每进一辆车,停车场就少了 1 个停车位,即信号量当前值 - 1。当前值为 0 时,停车场停满了,所有车不得进入统统在门口排队等。当一辆车离开后,释放其所占据的停车位 (sem_post),信号量当前值 + 1
信号量值得到释放后,如果门口有正在排队的车,那么就放进来,每放进来一个就重复前面的步骤。
(https://www.zhihu.com/question/40562993/answer/87204567 )
共享内存
共享内存就是能被几个进程一起用的内存。具体代码略。
库
库就是一堆函数的封装,可以理解为工具箱,里面放了各种工具(函数),可以随时拿来用。高级语言还有类库,不过 C 语言没有类,所以 C 语言的库是函数库。
静态库和动态库有什么区别
静态库就是你每次写个程序都要把工具箱放一个进去,动态库就是你的几个程序用同一个工具箱,用到的时候再去拿,不用每个程序都放一个。
网络编程
基本原理
层:和楼层一样,有了底层才有高层。通过一层层的抽象,可以实现更高级的功能。
ISO 七层模型
这个东西很好记,我编了个口诀:巫术网传会嫑用。具体有:
第 7 层 应用层
第 6 层 表达层
第 5 层 会话层
第 4 层 传输层
第 3 层 网络层
第 2 层 数据链路层
第 1 层 物理层
每一层我们用到再查,不用死记。知乎的人喜欢搞什么 “深入理解”,“系统学习”,结果有时候一个小小的知识点扯出几十页纸,连集线器的使用方法都要写进去,我觉得没必要。
TCP/IP 四层模型
口诀:连网传用,各层的意思就在口诀里。
1)连接层负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、ADSL 等等;
2)网络层负责分配地址和传送二进制数据,主要协议是 IP 协议;
3)传输层负责传送文本数据,主要协议是 TCP 协议;
4)应用层负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是 HTTP、FTP 等。
(http://www.ruanyifeng.com/blog/2009/03/tcp-ip_model.html)
地址
分为物理地址、IP 地址。相当于你家的地址。
端口
相当于你家的哪个房间。
IP 协议:略。
UDP 和 TCP
这个不能略了,因为真的会用到。
UDP 就是我只管发,收不收得到我不在乎。可靠性弱。
TCP 就是先和你联系上了再发,所以可靠性强。
TCP 的建立、传输与断开
C 表示 Client,客户端。
S 表示 Server,服务器。
三次握手:
- C: 我要连你(客户端给服务端发送请求连接的数据表)
- S: 好,我准备好了(服务端与客户端建立连接)
- C: 我发过去了(客户端发送数据)
四次挥手:
- S/C: 我发完了 / 我收完了(可以是服务器或客户端)
- C/S: 行,我同意关闭。
- S/C: 那我关了。
- C/S: 你关了那我也关了。
套接字编程
套接字其实就是 IP 地址:端口号
(我觉得这是个煞笔翻译。建议翻译为 “软插口”。)
套接字可以理解为传输数据的通道。具体用法略。
图形界面编程
略。