热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

目录系统调用函数与库函数库函数的组成库函数与系统调用的关系进程概述进程的定义进程与程序的区别进程的状态及其转换进程的调度机制进程控制块查看当前系统所有进程进程号

目录

系统调用函数与库函数 

库函数的组成

库函数与系统调用的关系 

进程概述

进程的定义

进程与程序的区别

进程的状态及其转换

进程的调度机制

 进程控制块

查看当前系统所有进程

进程号函数 

进程创建fork函数 

进程挂起

进程的等待

wait()

 waitpid

特殊进程 





系统调用函数与库函数 

库函数的组成


库函数与系统调用的关系 

 

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

 

 这里表示的意思是:我printf可以一直写,写到满了或者刷新缓冲区了,我再调用write函数,就相当于送快递,我需要等快递积累到了一定的数量时,我才开始派件,而不是来一个我送一个,不然很浪费时间

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


进程概述

进程的定义


进程与程序的区别

 进程是程序的一次执行过程


进程的状态及其转换

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


进程的调度机制

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

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


 进程控制块

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


 ​​​

 

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

 

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


查看当前系统所有进程

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

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

 

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



进程号函数 


进程创建fork函数 

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

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

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

 一旦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而已

到了指定时间后,进程成为就绪态(有了抢占cpu的资格),等待内核调度成为运行态


进程的等待


wait()

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

 

 等待该父进程创建的所有子进程(具有一定的缺陷也许)终止、回收资源、除非子进程终止或者来了一个信号否则一直阻塞等待、取返回值

 

不想要返回值的话就NULL 

 


指定子进程退出 waitpid

 

 

 前面的wait会死等,而waitpid提供了两种功能,死等和不死等,所以说waitpid完全可以替换wait,因为wait有的功能waitpid全都有

 ​​​​​​


特殊进程 

 

 


 



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
宛如画中人需_308
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有