注:本文是对朱老师linux应用编程和网络编程课程的备忘引导性笔记,主要是为了能够在学完后快速回忆起相关内容。本文主要记录了一些关键易忘性知识点并包含少量理解性内容,遵循尽量精简的原则,以尽量少的篇幅概括整个课程的知识点,便于后期能够快速定位知识点。故本文不包含具体的命令及函数使用方法等,同时不要太纠结于字面表达,这些只是为了能够快速回忆起相关知识点,具体的准确描述以及用法等需参考具体的文章。
(已完结)
文件IO
man 1 xx查linux shell命令,man 2 xxx查API, man 3 xxx查库函数
linux常用文件IO接口:open、close、write、read、lseek 、dup、dup2、fcntl
常见的标准IO库函数(glibc)有:fopen、fclose、fwrite、fread、ffulsh、fseek
文件描述符:其实质是一个数字,该数字的作用域就是当前进程,open一个文件时,OS在内存中构建了一些数据结构来表示这个动态文件,并返回给应用程序一个数字,这个数字与内存中这个动态文件的数据结构绑定,以后应用程序通过它操作这个动态文件。默认的stdin=0,stdout=1,stderr=2。
errno和perror
errno就是error number。linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会返回一个特定的errno编号来告诉我们这个函数到底哪里错了。errno是由OS来维护的一个全局变量,任何OS内部函数都可以通过设置errno来告诉上层调用者究竟刚才发生了一个什么错误。
函数perror(意思print error),perror函数内部会读取errno并且将这个不好认的数字直接给转成对应的错误信息字符串,然后print打印出来。例:perror("xxx");
静态文件信息表inode(i节点)和动态文件信息表vnode(v节点)
用open函数打开一个不存在的文件时要加上O_CREAT这个flag,并需要加上一个mode值用来指定所创建的文件的权限,该权限由5位数组成,一般前两位固定位0,后3位的值减去umask(见文件属性章节)的值表示所创建文件的权限。
将命令的输出重定位:可以使用“>”将命令的输出重定位到指定文件。比如ls > a.txt。其原理其实就是利用open+close+dup,open打开一个文件a.txt,然后close关闭stdout,然后dup将1和a.txt文件关联起来即可。
文件属性
linux中各种文件类型:普通文件(-),目录文件(d),字符设备文件(c),块设备文件(b),管道文件(p),套接字文件(s),符号链接文件(l)
在linux系统层面是不区分文本文件和二进制文件的,譬如之前学过的open、read、write等方法操作这两个时一点区别都没有
文件属性获取API:stat、fstat、lstat
文件属性获取命令:stat
文件所有者、文件所有者所在的组、其他用户
access函数可以测得当前执行程序的那个用户在当前环境下对目标文件是否具有某种操作权限
chmod命令与API:修改文件权限
chown命令与API:修改文件所有者
umask命令与API:umask的作用是用来设定我们系统中新创建的文件的默认权限的
读取目录文件:opendir与readdir函数。readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用readdir函数
可重入函数和不可重入函数
获取系统信息
jiffies是linux内核中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值。内核配置的时候定义了一个节拍时间,实际上linux内核的调度系统工作时就是以这个节拍时间为时间片的。jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1,然后到了系统的任意一个时间我们当前时间就被jiffies这个变量所标注。
内核在开机启动的时候会读取RTC硬件获取一个时间作为初始基准时间 ,这个基准时间对应一个jiffies值(这个基准时间换算成jiffies值的方法是:用这个时间减去1970-01-01 00:00:00 +0000,然后把这个时间段换算成jiffies数值),这个jiffies值作为我们开机时的基准jiffies值存在。然后系统运行时每个时钟节拍的末尾都会给jiffies这个全局变量加1,因此操作系统就使用jiffies这个全局变量记录了下来当前的时间。当我们需要当前时间点时,就用jiffies这个时间点去计算(计算方法就是先把这个jiffies值对应的时间段算出来,然后加上1970-01-01 00:00:00 +0000即可得到这个时间点)。
操作系统只在开机时读一次RTC,整个系统运行过程中RTC是无作用的。RTC的真正作用其实是在OS的2次开机之间进行时间的保存。
一个时间节拍的时间取决于操作系统的配置,现代linux系统一般是10ms或者1ms。这个时间其实就是调度时间。
常用的时间相关的API和C库函数有:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday.。
其中gettimeofday可以得到更加精确的事件,微秒级。
rand函数可以返回一个0-RAND_MAX(定义在stdlib.h中)之间的伪随机数
srand函数用来设置rand获取伪随机数的种子
单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列。因为rand内部的算法其实是通过一个种子(seed,其实就是一个原始参数,int类型),rand内部默认是使用1作为seed的,种子一定的算法也是一定的,那么每次得到的伪随机序列肯定是同一个。
一般常规做法是用time函数的返回值来做srand的参数
proc文件系统:专门用于调试内核。在内核中构建一个虚拟文件系统/proc,内核运行时将内核中一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中,这样相当于将不可见的内核中的数据结构以可视化的方式呈现给内核的开发者。proc目录下的文件大小都是0,因为这些文件本身并不存在于硬盘中,他也不是一个真实文件,他只是一个接口,当我们去读取这个文件时,其实内核并不是去硬盘上找这个文件,而是映射为内核内部一个数据结构被读取并且格式化成字符串返回给我们。
常用proc中的文件
(1)/proc/cmdline
(2)/proc/cpuinfo
(3)/proc/devices 系统中所有的设备
(4)/proc/interrupts 系统中用到的所有中断
sys文件系统:sys文件系统本质上和proc文件系统是一样的,都是虚拟文件系统,都在根目录下有个目录(一个是/proc目录,另一个是/sys目录),因此都不是硬盘中的文件,都是内核中的数据结构的可视化接口。不同的是/