千锋教育嵌入式物联网教程之系统编程篇学习-02

目录

系统调用函数与库函数 

库函数的组成

库函数与系统调用的关系 

进程概述

进程的定义

进程与程序的区别

进程的状态及其转换

进程的调度机制

 进程控制块

查看当前系统所有进程

进程号函数 

进程创建fork函数 

进程挂起

进程的等待

wait()

 waitpid

特殊进程 


系统调用函数与库函数 

库函数的组成

千锋教育嵌入式物联网教程之系统编程篇学习-02_第1张图片

库函数与系统调用的关系 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第2张图片 

这里指的是访问文件的库函数,比如C语言我们学的fopen 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第3张图片 

 这里表示的意思是:我printf可以一直写,写到满了或者刷新缓冲区了,我再调用write函数,就相当于送快递,我需要等快递积累到了一定的数量时,我才开始派件,而不是来一个我送一个,不然很浪费时间千锋教育嵌入式物联网教程之系统编程篇学习-02_第4张图片

 总结:大部分的库函数仍然是系统调用,只不过库函数去系统调用的路上多了缓冲区而已,从而减少系统调用的次数

进程概述

进程的定义

进程与程序的区别

千锋教育嵌入式物联网教程之系统编程篇学习-02_第5张图片

千锋教育嵌入式物联网教程之系统编程篇学习-02_第6张图片 进程是程序的一次执行过程

进程的状态及其转换

千锋教育嵌入式物联网教程之系统编程篇学习-02_第7张图片

想想-FreeRTOS的知识,因为FreeRTOS也是一个操作系统,而linux也是操作系统,有点知识是像的

进程的调度机制

时间片轮转也是FreeRTOS的调度机制

上下文切换就是保存上文执行下文

千锋教育嵌入式物联网教程之系统编程篇学习-02_第8张图片

 进程控制块

进程控制块-保存一个进程的相关内容的结构体

千锋教育嵌入式物联网教程之系统编程篇学习-02_第9张图片

 ​​​千锋教育嵌入式物联网教程之系统编程篇学习-02_第10张图片

 

 这里举了进程控制块具备的信息--很多信息,比FreeRTOS具备的更多,因为linux内核更复杂,但是学了FreeRTOS能更好理解,学一个小型的操作系统,有利于理解大型的操作系统(Linux)

 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第11张图片

进程号是内核随机分配的,用户无法控制。并且0和1被使用,1是祖先进程,0是交换进程

查看当前系统所有进程

这里的所有进程是指真正运行的进程,如果一个程序运行了一次的话,那么是不会存在的,因为该进程已经被销毁了,因此如果你想查询自己创建的进程的话,那么需要使你的程序是一个死循环

千锋教育嵌入式物联网教程之系统编程篇学习-02_第12张图片

千锋教育嵌入式物联网教程之系统编程篇学习-02_第13张图片

如果单纯输入ps,那么就是显示当前进程的信息,其实当前进程就是ps

 千锋教育嵌入式物联网教程之系统编程篇学习-02_第14张图片

 我们打开qq,分别与1,2,3号联系人聊天,并且打开聊天窗口,那么3个窗口表示3个进程,而qq就相当于父进程

进程号函数 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第15张图片

进程创建fork函数 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第16张图片

 根据返回值来区分父子进程

父子进程相互独立,有各自的存储空间--独立的地址

类似于租房子,每个房子的样子是一样的,但是地址不一样(房间号不一样),初始的设备和装修也是一样,通过房间号(相当于返回值)进行区分,并且父子进程的执行顺序不确定,因为你不知道哪一个房间先装修,这个取决于装修工人(相当于内核)

千锋教育嵌入式物联网教程之系统编程篇学习-02_第17张图片

 一旦fork了,那么子进程就会有父进程后面的代码了

fork();
printf("hello\n");  --结果是打印2个hello

这里是没有区分父子进程,这里的例子只是为了理解,子进程保存了父进程拥有的东西

fork();
printf("hello\n");
fork();
printf("hello\n");---打印6个hello

但是父子进程也是有联系的,比如磁盘空间,就相当于电梯,都是一个电梯,大家公用

场景分析:文件中有20个字节数,父进程read-15个字节,然后子进程read,那么子进程只能read后面的5个字节,而不能从头开始,因为文件的偏移指针已经改变了,所以文件是公用的,因为它不在用户区,而是在内核区

进程挂起

其实就是相当于FreeRTOS中的delay而已

千锋教育嵌入式物联网教程之系统编程篇学习-02_第18张图片到了指定时间后,进程成为就绪态(有了抢占cpu的资格),等待内核调度成为运行态

进程的等待

wait()

类似于FreeRTOS的信号量等,等待某一个事情发生才能执行下面的代码,否则就一直阻塞等待。而这里的就是父进程等待子进程运行完,后面的代码才能被执行

千锋教育嵌入式物联网教程之系统编程篇学习-02_第19张图片 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第20张图片 等待该父进程创建的所有子进程(具有一定的缺陷也许)终止、回收资源、除非子进程终止或者来了一个信号否则一直阻塞等待、取返回值

千锋教育嵌入式物联网教程之系统编程篇学习-02_第21张图片

 千锋教育嵌入式物联网教程之系统编程篇学习-02_第22张图片

不想要返回值的话就NULL 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第23张图片 

指定子进程退出 waitpid

 千锋教育嵌入式物联网教程之系统编程篇学习-02_第24张图片

千锋教育嵌入式物联网教程之系统编程篇学习-02_第25张图片 

 前面的wait会死等,而waitpid提供了两种功能,死等和不死等,所以说waitpid完全可以替换wait,因为wait有的功能waitpid全都有千锋教育嵌入式物联网教程之系统编程篇学习-02_第26张图片

 ​​​​​​千锋教育嵌入式物联网教程之系统编程篇学习-02_第27张图片

特殊进程 

千锋教育嵌入式物联网教程之系统编程篇学习-02_第28张图片 

 

 

你可能感兴趣的:(linux学习,学习)