1.普通文件(-) 注:-是普通文件的标识linux
(1)文本文件:文件中的内容是由文本构成的,文本指的是ASCII码字符。文本里的内容本质上都是数字。而文本文件中的数字自己应该被理解为这个数字对应的ASCII码。常见的.c文件,.h文件,.txt文件等都是文本文件。正则表达式
(2)二进制文件:二进制文件中存储的本质上也是数字,只不过这些数字并非文件的编码数字,而是就是正真的数字。常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译链接生成的.bin)都是二进制文件。shell
(3)使用文本编辑器去打开文件的时候,编辑器会read读出文件二进制数字内容,而后按照编码格式去解码将其还原成文字展示给咱们。编程
(4)若是使用文本编辑器去打开一个二进制文件会如何?这个时候编辑器就觉得这个二进制文件仍是文本文件而后试图将其解码成文字,可是解码过程不少数字并不对应有意义的文字因此成了乱码。ubuntu
(5)用二进制阅读工具去读取文本文件会怎么样?得出的就是文本文字所对应的二进制的编码。数组
2.目录文件(d)服务器
(1)目录就是文件夹,文件夹在Linux中也是一种文件,不过是特殊文件。用vi打开一个文件夹就能看到,文件夹其实也是一种特殊文件,里面存的内容包括这个文件的路径,还有文件夹里面的文件列表。网络
3.设备文件 (字符设备文件的标识符:c,块设备文件(b))数据结构
(1)设备文件对应的是硬盘设备,也就是说这个文件虽然在文件系统中存在,可是并非真正存在于硬盘上的一个文件,而是文件系统虚拟制造出来的(叫虚拟文件系统,如/dev/ sys/ proc等)。多线程
4.管道文件标识符(p),套接字文件标识符(s) 符号链接符文件(l)
5.查看文件属性:stat、fstat、lstat。stat是从文件名出发获得文件属性信息结构体,而fstat是从一个已经打开的文件fd出发获得一个文件的属性信息。stat是从磁盘去读取文件的,而fstat是从内存读取动态文件的。对于符号连接文件,stat和fstat查阅的是符号连接文件指向的文件的属性,而lstat查阅的是符号连接文件自己的属性。
6.struct stat是内核定义的一个结构体,在<sys/stat.h>中声明,这个结构体中的全部元素加起来就是咱们的文件属性信息。
7.文件属性中的文件类型标志(-、d、l等等)在struct stat结构体的mode_t st_mode元素中,这个元素实际上是一个按位来定义的一个位标志。
8.文件类型和文件的权限都记录在st_mode中。
9.ls -l 打印出的权限列表
(1)123456789 一共9位,3个一组。第一组三个表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第2组3个位表示文件的属主所在的组(group)对该文件的权限;第3组3个位表示其余用户(othres)对该文件的权限。
(2)能够用chown命令修改一个文件的属主,还能够用chgrp命令去修改一个文件所在的组。
10.access函数检查权限设置
(1)access函数能够测试获得当前执行程序的那个用户在当前那个环境下对目标文件是否具备某种操做权限。
11.chmod/fchmod 与权限修改
(1)chmod 是一个linux命令,用来修改文件的各类权限属性。chmod命令只有root用户才有权利去执行修改。
(2)chmod命令其实内部是用linux的一个叫chmod的API实现的。
12.chown/fchown/lchown与属主修改
(1)linux中有两个chown命令来修改文件属性
(2)chown命令是用chown API实现的。
13.umask与文件权限掩码
(1)umask的做用是用来设定咱们系统中新建立的文件的默认权限的。
(2)umask 命令就是用umask API实现的。
14.读取目录文件
(1)opendir打开一个目录后获得一个DIR类型的指针给readdir使用
(2)readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。
(3)readdir 调用一次只能读取一个目录项,要想读取目录中全部的目录项必须屡次调用readdir函数。readdir函数内部户记住哪一个目录项已经被读过了哪一个还没读,因此屡次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中全部的目录项已经读完了。
15.GMT时间
(1)GTM是格林尼治时间,也就是格林尼治世间的当地时间,全球国际时间,用一描述全球性的事件的时间。
16.计算机中与时间有关的部件
(1)点时间和段时间.段时间=点时间-点时间
(2)定时器(timer)定的时间就是段时间,实时时钟(RTC)就是和点时间有关的一个器件。
17.jiffies
(1)jiffies是linux内核中的一个全局变量,这个变量用来记录之内核的节拍时间为单位时间长度的一个数值。
(2)内核配置的时间定义了一个节拍时间,实际上linux内核的调度系统工做时就是以这个节拍时间为时间片的。
(3)jiffies变量开机时有一个基准值,而后内核每过一个节拍时间jiffies就会加1,而后到了系统的任意一个时间咱们当前时间就被jiffies这个变量所标注。
18.linux系统如何记录时间
(1)内核在开机启动的时候会读取RTC硬件获取一个时间做为初始基准时间,这个基准时间对应一个jiffies值(这个基准时间换算成jiffies值的方法是:用这个时间减去1970-01-01 00:00:00 +0000 (UTC),,而后把这个时间段换算成jiffies数值)。这个jiffies值做为咱们开机时的基准jiffies值存在。而后系统运行时每一个时钟节拍的末尾都会给jiffies这个全局变量加1,所以操做系统会使用欧冠jiffies这个全局变量记录了下来当前的时间。
(2)其实操做系统只在开机时读一次RTC,整个操做系统运行过程当中RTC是物做用的。RTC的正真做用实际上是在OS的2次开机之间进行时间的保存。
(3)jiffies这个变量记录的实际上是段时间(其实就是当前时间和1970-01-01 00:00:00 +0000(UTC)这个时间的差值)
(4)一个时间节拍的时间取决于操做系统的配置,现代linux系统通常是10ms或者1ms。这个时间其实就是调度时间,在内核中用HZ来记录和表示。若是HZ定义成1000难么时钟节拍就是1/HZ,也就是1ms。
19.linux中时间相关的系统调用
(1)经常使用的时间相关的API和C库函数有9个:
time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday
(2)time系统调用返回当前时间以秒为单位的距离1970-01-01 00:00:00 +0000(UTC)过去的秒数。这个time内部就是用jiffies换算获得的秒数。其余函数基本都是围绕着time来工做的。
(3)gmtime(国际时间)localtime(本地时间) 获得的秒数变成一个struct tm结构体表示的时间。 mktime完成相反的转换(struct tm 到time_t)
(4)若是从struct tm出发想获得字符串格式的时间,能够用asctime或者strftime均可以
(5)gettimeofday返回的时间是由struct timeval(时间)和struct timezone(时区)这两个结构体来共同表示的。settimeofday是用来设置当前的时间和时区的。
(6)总结:无论用哪一个系统调用,最终获得的时间本质上都是一个时间(这个时间最终都是从kernel中记录的jiffies中计算获得的),只不过不一样的函数返回的时间格式不一样,精度不一样。
(7)getime获取的时间中:年份是以1990为基准的差值,月份是0表示1月份。
20.linux中是使用随机数
(1)连续屡次调用rand函数能够返回一个伪随机数序列。单纯使用rand重复调用n次,就会获得0-RAND_MAX之间的序列,每次执行程序获得的伪随机数是同一个序列,没发获得其余序列。
(2)srand函数用来设置rand获取的伪随机数列的种子。通常常规作法是用time函数的返回值来作srand的参数。
21.proc文件
(1)proc目录下的文件大小都是0,由于这些文件自己并不存在于硬盘中,他也不是一个真实文件,他只是一个接口,当咱们去读取这个文件时,其实内核并非去硬盘上找这个文件,而是映射为内核内部一个数据结构被读取而且格式化成一个字符串返回给咱们。因此尽管咱们看到的仍是一个文件内容字符串,和普通文件是同样的;可是实际上咱们知道这个内容是实时的从内核中数据结构来的,而不是硬盘中来的。
(2)cat以手工查找
(3)程序中能够文件IO访问
(4)在shell程序中用cat命令结合正则表达式来获取并处理内核信息。
22.sys文件系统
(1)sys文件系统本质上和proc文件系统是同样的,都是虚拟文件系统,都在根目录下有目录(一个是/proc目录,另外一个是/sys目录),所以都不是硬盘中的文件,都是内核中的数据结构的可视化接口。
(2)不一样的是/proc中的文件只能读,可是/sys中的文件能够读取。读/sys中的文件就是获取内核中数据结构的值,而写入/sys中的文件就是设置内核中的数据结构的元素的值。
23.main函数由谁调用
(1)编译连接时的引导代码。
(2)运行时的加载器。
(3)程序在编译连接时用连接器,运行时用加载器。
(4)argc和argv的传参如何实现。
24.程序如何结束
(1)正常终止:return 、exit、_exit
(2)非正常终止:本身或他人发信号终止处理函数
(3)atexit注册进程终止处理函数、atexit注册多个进程终止处理函数,先注册的后执行(先进后出、栈)
(4)return和exit效果同样,都是会执行进程终止处理函数,可是用_exit终止进程时并不执行atexit注册的进程终止处理函数。
25.环境变量
(1)export命令查看环境变量
(2)进程环境变量表介绍:每个进程中都有一份全部环境变量构成的一个表格,也就是说咱们当前进程中能够直接使用这些环境变量。进程环境变量表实际上是一个字符串数组,用environ变量指向它。
(3)进程中经过environ全局变量使用环境变量。
(4)获取执行环境变量函数getenv。
26.进程运行的虚拟地址空间
(1)操做系统中每一个进程在独立地址空间中运行。
(2)每一个进程的逻辑地址空间均为4GB(32操做系统)
(3)0-1G为OS,1-4G为应用
(4)虚拟地址到物理地址空间的映射
(5)意义:进程隔离,提供多进程同时运行。
27.进程
(1)进程控制块PCB(process control block),内核中专门用来管理一个进程的数据结构。
(2)查看进程命令 ps、ps -a、ps-aux
28.进程ID
(1)getpid(进程ID)、getppid(父进程ID)、getuid(进程用户ID)、geteuid(有效用户ID)、getgid(组ID)、getegid(有效组ID)
(2)实际用户ID、有效用户ID
29.多进程调度原理
(1)操做系统同时运行多个进程
(2)宏观上的并行和微观上的串行
(3)实际上现代操做系统最小的调度单元是线程而不是进程。
30.fork建立子进程
(1)为何要建立子进程(1)每一次进程的运行都须要一个进程(2)多进程实现宏观上的并行。
(2)进程的分裂生长模式。若是操做系统须要一个新进程来运行一个程序,那么操做系统会用一个现有的进程来复制成一个新进程。老进程叫父进程,复制生成的新进程叫子进程。
(3)fork函数调用一次会返回2次,返回值等于0就是子进程,而返回值大于0的就是父进程。
(4)使用fork的方法:使用fork后而后用if判断返回值,而且返回值大于0时就是父进程,等于0的就是子进程。
(5)fork的返回值在子进程中等于0,在父进程中等于本次fork建立的子进程的进程ID。
31.子进程
(1)子进程有本身独有的PCB
(2)子进程被内核同等调度
32.子进程继承父进程中打开的文件
(1)上下文:父进程先open打开一个文件获得fd,而后在fork建立子进程。以后在父进程中各自write向fd中写入内容。
(2)测试结论:结束写。实际上本质缘由是父子进程之间的fd对应的文件指针是彼此关联的.
(3)实际测试时有时候会看到只有一个,有点像分贝写。但实际不是。
33.父子进程各自独立打开同一文件实现共享。
(1)父进程open打开1.txt而后写入,子进程打开1.txt而后写入,结论:分别写。缘由是父子进程分离后才各自打开的1.txt,这时候两个进程的PCB已经独立了,文件表也独立了,所以2次读写是彻底独立的。
(2)open时使用O_APPEND标志看看会如何?实际测试结果标明O_APPEND标致能够把父子进程各自打开的fd的文件指针关联起来,实现分别写。
34.(3二、33)总结
(1)父进程在没有fork以前本身作的事情对子进程有很大影响,可是父进程fork以后在本身的if里作的事情就对子进程没有影响了。本质缘由就是由于fork内部实际上已经复制父进程的PCB生成了一个新的子进程,而且fork返回的子进程已经彻底和父进程脱离,而且独立被OS调度执行。
(2)子进程最终目的是要独立去运行另外的程序。
35.进程的消亡
(1)linux系统设计时规定:每个进程退出时,操做系统会自动回收这个进程涉及到的全部资源,可是操做系统只是回收了这个进程工做时消耗的内存和IO,并无回收这个进程自己占用的内存(主要是task_struct和栈内存)。
(2)由于进程自己的8KB内存(主要是task_struct和栈内存)操做系统不能回收须要别人来辅助回收,所以咱们每一个进程都须要一个帮助它收尸的人,这我的就是进程的父进程。
36.僵尸进程
(1)子进程先于父进程结束。子进程结束后父进程此时并不必定当即就能帮助子进程“收尸”,在这一段(子进程已经结束且父进程还没有帮其收尸)子进程就被称为僵尸进程。
(2)子进程除task_struct和栈外其他内存空间皆已清理。
(3)父进程可使用wait或waitpid回收子进程,此时父进程结束时同样会回收子进程的剩余待回收内存资源。(这样设计是为了防止父进程忘记显示调用wait/waitpid来回收子进程从而形成内存泄露)
37.孤儿进程
(1)父进程先于子进程结束,子进程称为一个孤儿进程。
(2)linux系统规定:全部的孤儿进程都自动称为一个特殊进程(进程1,也就是init进程)的子进程。
38.父进程wait回收子进程
(1)wait的工做原理:
(I)子进程结束时,系统向其父进程发送SIGCHILD信号
(II)父进程调用wait函数后阻塞
(III)父进程被SIGCHILD信号唤醒而后去回收僵尸子进程。
(IV)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通讯问题,让父进程能够及时的去回收僵尸子进程。
(V)若父进程没有任何子进程则wait返回错误。
(2)wait的参数status。status用来返回子进程结束时的状态,父进程经过wait获得status后就能够知道子进程的一些结束状态信息。
(3)wait的返回值pid_t,这个返回值就是本次wait回收的子进程的PID。当期进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就能够用来判断究竟是哪个子进程本次被回收了。
(4)wait作个总结:wait主要是用来回收子进程资源,回收同时还能够得知被回收子进程的pid和退出状态。
(5)fork后wait回收实例。
(6)WIFEXITED、WIFSIGNALED、WEXITSTATUS这几个宏用来获取子进程的退出状态。
(I)WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)
(II)WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)
(III)WEXITSTATUS宏用来获得正常终止状况下的进程返回值的。
39.waitpid和wait的差异
(1)基本功能同样,都是用来回收子进程。
(2)waitpid能够回收指定PID的子进程。
(3)waitpid能够阻塞式或非阻塞式两种工做模式。
40.使用waitpid
(1)使用waitpid实现wait的效果 :ret=waitpid(-1,&status,0);-1表示不等待某个特定PID的子进程而是回收任意一个子进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本次回收的子进程的PID。
(2)ret=waitpid(pid,&status,0);等待回收PID为pid的这个子进程,若是当前进程并无一个ID号为pid的子进程,则返回值为-1;若是成功回收了pid这个子进程则返回值为回收的进程的PID。
(3)ret=waitpid(pid,&status,WNOHANG);这种表示父进程要非阻塞式的回收子进程。此时若是父进程执行waitpid时子进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的子进程的PID;若是父进程waitpid时子进程还没有结束则父进程马上返回(非阻塞),可是返回值为0(表示回收不成功)。
41.竞态初步引入
(1)静态全称是:竞争状态,多进程环境下,多个进程同时抢占系统资源(内存、CPU、文件IO)
(2)竞争状态对OS来讲是很危险的,此时OS若是没处理好就会形成结果不肯定。
42.为何须要exec函数
(1)fore子进程是为了执行新程序(fork建立了子进程后,子进程和父进程同时被OS调度执行,所以子进程能够单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行)
(2)能够直接在子进程的if中写入新程序的代码。这样能够,但不够灵活,由于咱们只能把子进程程序的源代码贴过来执行。
(3)使用exec族运行新的可执行程序(exec族函数能够直接把一个编译好的可执行程序直接加载运行)
(4)咱们有了exec族函数后,咱们典型的父子进程程序是这样的:子进程须要运行的程序被单独编写,单独编译链接成一个可执行程序(叫hello),(项目是一个多进程项目)主程序为父进程,fork建立了子进程后在子进程中exec来执行hello,达到父子进程分别作不一样程序同时(宏观上)运行的效果。
43.exec族的6个函数
(1)execl和execv
(2)execlp和execvp
(3)execle和execvpe
44.进程状态
(1)就绪态:这个进程当前全部运行条件就绪,只要获得了CPU时间就能直接运行。
(2)运行态:就绪态获得了CPU就进入运行态开始运行。
(3)僵尸态:进程已经结束可是父进程还没来得及回收。
(4)等待态:(浅度睡眠&深度睡眠),进程在等待某种条件,条件成熟后可进入就绪态。等待态下就算你给他CPU调度进程也没法执行。浅度睡眠等待时进程能够被(信号)唤醒,而深度睡眠等待时不能被唤醒只能等待的条件到了才能结束睡眠状态。
(5)暂停态:暂停并非进程的终止,只是被人(信号)暂停了,还能够回复的。
45.system函数
(1)ststem函数=fork+exec;
(2)原子操做:原子操做意思就是整个操做一旦开始就会不被打断的执行玩。原子操做的好处就是不会被人打断(不会引来竞争关系),坏处是本身单独连续占用CPU时间太长影响系统总体实时性,所以应该尽可能避免没必要要的原子操做,就算不得不原子操做也应该尽可能原子操做的时间缩短。
46.守护进程
(1)进程查看命令ps
(I)ps -ajx 偏向显示各类有关的ID号
(II)ps -aux 偏向显示进程各类占用资源
(2)向进程发送信号指令kill
(I)kill -信号编号 进程ID,向一个进程发送一个信号
(II)kill -9 xxx 将向xxx这个进程发送9号信号,也就是要结束进程。
(3)daemon 标识守护进程,简称为d(进程名后面带d的基本就是守护进程)
(4)长期运行(通常是开机运行直到关机时关闭)
(5)与控制台脱离(普通进程都和运行该进程的控制台相绑定,表现为若是终端被强制关闭了则这个终端中运行的全部进程都被会关闭,背后的问题还在于会话)
(6)服务器程序通常都实现为守护进程。
(7)syslogd,系统日志守护进程,提供syslog功能。
(8)cron,cron进程用来实现操做系统的时间管理,linux中实现定时执行程序的功能就要用到cron。
(9)任何一个进程均可以将本身实现成守护进程。
47.create_daemon函数要素
(1)子进程等待父进程退出
(2)子进程使用setsid建立新的会话期,脱离控制台
(3)调用chdir将当前工做目录设置为/
(4)umask设置为0以取消任何文件权限屏蔽
(5)关闭全部文件描述符
(6)将0、一、2定位到/dev/null
48.使用syslog来记录调试信息
(1)openlog,syslog,closelog
(2)通常log信息都在操做系统的 /var/log/messages这个文件中存储着,可是ubuntu中是在/var/log/syslog文件中的,查看cat /var/log/syslog。
49. syslog的工做原理
(1)操做系统中有一个守护进程syslogd(开机运行,关机结束),这个守护进程syslogd负责进行日志文件的写入和维护。
(2)syslogd时独立于咱们任意一个进程而运行的。咱们当前进程和syslogd进程原本时没有任何关系的,可是咱们当前进程能够经过调用openlog打开一个和syslogd相链接的通道,而后经过syslog向syslogd发送消息,而后由syslogd来将其写入到日志文件系统中。
(3)syslogd其实就是一个日志文件系统的服务器进程,提供日志服务。任何须要写日志的进程均可以经过openlog/syslog/closelog这三个函数来利用syslogd提供的日志服务。这就是操做系统的服务式的设计。
50.让进程不能屡次运行
(1)咱们的程序具备一个单例运行的功能。运行程序,没有运行则运行,若是已经运行,则本次直接退出。
(2)最经常使用的实现方法:用一个文件的存在是否来作标志。
51.linux的进程间通讯
(1)为何须要进程间通讯
(I)进程间tongxin(IPC)指的是2个任意进程之间的通讯。
(II)同一个进程在一个地址空间中,因此同一个i额进程的不一样模块(不一样函数、不一样文件)之间都是很简单的(不少时候i是全局变量,也能够经过函数形参实参传递)
(III)2个不一样的进程处于不一样的地址空间,所以要互相通讯很难。
(2)linux内核提供多种进程间通讯机制
(I)无名管道和有名管道
(II)SystemV IPC:信号量、消息队列、共享内存
(III)Socket域套接字
(IV)信号
52.linux的IPC机制
(1)管道(无名管道)
(I)管道通讯的原理:内核维护的一块内存,有读端和写端(管道是单向通讯的)。
(II)管道通讯的方法:父进程建立管理后fork子进程,子进程继承父进程的管道fd
(III)管道通讯的限制:只能在父子进程间通讯、半双工。
(IV)管道通讯的函数:pipe、write、read、close
(2)有名管道(fifo)
(I)有名管道原理:实质也是内核维护的一块内存,表现形式为一个有名字的文件
(II)有名管道的使用方法:固定一个文件名,2个进程分别使用mkfifo建立fifo文件,而后分别open打开获取到fd,而后一个读一个写。
(III)管道通讯限制:半双工(不限父子进程,任意2个进程均可)
(IV)管道通讯的函数:mkfifo、open、write、read、close
53.SystemV IPC介绍
(1)SystemV IPC的基本特色
(I)系统经过一些专用API来提供SystemV IPC功能
(II)分为:信号量、消息队列、共享内存、信号、Unix域套接字socket
(III)其实质也是内核提供的公共内存。
54.消息队列
(1)本质上是一个队列,队列能够理解为(内核维护的一个)FIFO
(2)工做时A和B2个进程进行通讯,A向队列中放入消息,B从队列中读出消息。
55.信号量
(1)实质就是个计数器(其实就是一个能够用来计数的变量,能够理解为int a)
(2)经过计数值来提供互斥和同步
56.共享内存
(1)大片内存直接映射
(2)相似于LCD显示时的显存用法
57.什么是信号
(1)信号是内容受限的一种异步通讯机制
(I)信号的目的:用来通讯
(II)信号是异步的(对比硬件中断)
(III)信号本质上是int型数字编号(事先定义好的)
(2)信号由谁发出的
(I)用户在终端按下按键
(II)硬件异常后由操做系统内核发出信号
(III)用户使用kill命令向其余进程发出信号。
(IV)某种软件条件知足后也会发出信号,如alarm闹钟时间到会产生SIGALARM信号,向一个读端已经关闭的管理write时会产生SIGPIPE信号。
(3)信号由谁处理、如何处理
(I)忽略信号
(II)捕获信号(信号绑定了一个函数)
(III)默认处理(当前进程没有明显的管这个信号,默认:忽略或终止进程)。
58.常见信号介绍
(1)SIGINT 2 Ctrl+C时OS送给前台进程组中每一个进程
(2)SIGABRT 6 调用abort函数,进程异常终止
(3)SIGPOLL SIGIO 8 指示一个异步IO事件,在高级IO中说起
(4)SIGKILL 9 杀死进程的终极办法
(5)SIGSEGV 11 无效存储访问时OS发出该信号
(6) SIGPIPE 13 涉及管道和socket
(7)SIGALARM 14 涉及alarm函数的实现
(8)SIGTERM 15 kill命令发送的OS默认终止信号
(9)SIGCHLD 17 子进程终止或中止时OS向其父进程发此信号
(10)
SIGUSR1 10 用户自定义信号,做用和意义由应用本身定义
SIGUSR2 12
59.进程对信号的处理
(1)用signal函数处理SIGINT信号
(1)默认处理
(2)忽略处理
(3)捕获处理
细节:
(1)signal函数绑定一个捕获函数后信号发生后会自动执行绑定的捕获函数,而且把信号编码做为传参传给捕获函数
(2)signal的返回值在出错时为SIG_ERR,绑定成功时,返回旧的捕获函数
60.signal函数的优缺点
(1)优势:简单好用,捕获信号经常使用
(2)缺点:没法简单直接得知以前设置的对信号的处理方法
61.sigaction函数介绍
(1)2个都是API,可是sigaction比signal更具备可移植性。
(2)用法关键是2个sigaction指针
(3)sigaction比signal好的一点:sigaction能够一次获得设置新捕获函数和获取旧的捕获函数(其实还能够单独设置新的捕获函数或者单独只获取旧的捕获函数),而signal函数不能单独获取旧的捕获函数而必须在设置新的捕获函数的同时才获取旧的捕获函数。
62.alarm函数
(1)内核以API形式提供的闹钟
63.pause函数
(1)内核实践
(2)pause函数的做用就是让当前进程暂停运行,交出CPU给其余进程去执行。当当前进程进入pause状态后当前进程会表现为"卡住、阻塞住",要退出pause状态当前进程须要被信号唤醒。
64阻塞IO
(1)常见的阻塞:write、pause、sleep等函数;read或write某些函数
(2)如何实现非阻塞IO访问:O_NONBLOCK和fcntl
65.何为IO多路复用
(1)IO multiplexing
(2)多路非阻塞式IO
(3)select和poll
(4)外部阻塞式,内部非阻塞式自动轮询多路阻塞式IO
(5)IO多路复用实践
(I)用select函数实现同时读取键盘鼠标
(II)用poll函数实现同时读取键盘鼠标
66.异步IO
(1)几乎能够认为:异步IO就是操做系统用软件实现的一套中断相应系统
(2)异步IO的工做方法是:咱们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),而后当前进程能够正常处理本身的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数处理这个异步事件
(3)涉及的函数:
(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)
(2)signal或者sigaction(SIGIO)
67.进程
(1)使用进程技术的优点
(I)CPU时分复用,单核心CPU能够实现宏观上的并行
(II)实现多任务系统需求(多任务的需求是客观的)
(2)进程技术的劣势
(I)进程间切换开销大
(II)进程间通讯麻烦并且效率低
(3)解决方案就是线程技术
(I)线程技术保留了进程技术实现多任务的特性。
(II)线程的改进就是在线程间切换和线程间通讯上提高了效率。
(III)多线程在多核心CPU上面更有优点。
68.线程
(1)linux中的线程简介
(I)一种轻量级进程
(II)线程是参与内核调度的最小单元
(III)一种进程中能够由多个现场
(2)线程技术的优点
(I)像进程同样可被OS调度
(II)同一进程的多个线程之间很容易高校率通讯
(III)在多核心CPU(对称多处理器架构SMP)架构下效率最大化。
69.线程常见函数
(1)线程建立与回收
(I)pthread_create 主线程用来建立子线程
(II)pthread_join 主线程用来等待(阻塞)回收子线程
(III)pthread_detach 主线程用来分离子线程,分离后主线程没必要再去回收子线程
(2)线程取消
(I)pthread_cancel 通常都是主线程调用该函数去取消(让它赶忙死)子线程
(II)pthread_setcancelstate 子线程设置本身是否容许被取消
(III)pthread_setcanceltype
(3)线程函数退出相关
(I)pthread_exit与return 退出
(II)pthread_cleanup_push
(III)pthread_cleanup_pop
(4)取消线程id
(I)pthread_self
70.线程同步之信号量12
(1)任务:用户从终端输入任意字符而后统计个数显示,输入end则结束
(2)使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数。
71.互斥锁
(1)互斥锁又叫互斥量(mutex)
(2)相关函数:pthread_mutex_init pthread_mutex_destory pthread_mutex_lock pthread_mutex_unlock
(3)互斥锁和信号量的关系:能够认为互斥锁是一种特殊的信号量
(4)互斥锁主要用来实现关键段保护。
72.现成同步之条件变量
(1)相关函数:pthread_cond_init pthread_cond_destroy pthread_cond_wait phtread_cond_signal/pthread_cond_broadcast
73.网络通讯
(1)从进程间通讯提及:网络域套接字socket,网络通讯其实就是网络网络中不一样主机上,面的2个进程之间的通讯
(2)网络通讯的层次
(I)硬件设备:网卡
(II)操做系统底层:网卡驱动
(III)操做系统API:socket接口
(IV)应用层:低级(直接基于socket接口编程)
(V)应用层:高级(基于网络通讯应用框架库)
(VI)应用层:更高级(http、网络控件)
74.网络通讯的传输媒介
(1)无限传输:WIFI、蓝牙、zigbee、4G/5G/GPRS等。
(II)无限传出:双绞线、同轴电缆、光钎等