开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:系统调用的概念】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/10972
系统调用的概念
内容介绍
一、学习思路
二、系统调用
一、 学习思路
系统编程的概念,所谓的系统编程是在程序中调用操作系统提供的接口函数进行编程实现一些功能,然后讲系统调用I/O函数,以前讲过F/open,F/read,F/write,文件读写函数,
但是F/open,F/read,F/write属于标准C库的RO库函数。
二、系统调用
1.1系统编程概述
调用操作系统提供的接口函数进行编程实现一些功能
①操作系统的职责
操作系统用来管理所有的资源,并将不同的设备和不同的程序关联起来。
电脑中有一些资源比如说屏幕按键鼠标,还可以连接外接打印机等,操作系统就是用来管理这些资源的,操作系统帮忙管理硬件,使用户能够更有效方便的去使用电脑。
②什么是 Linux 系统编程
在有操作系统的环境下编程,并使用操作系统提供的系统调用及各种库,对系统资源进行访问。学会了 C 语言再知道一些使用系统调用的方法,就可以进行 Linux 系统编程了。
像以前学51单片机直接写一个may函数在单片机中运行,这个单片机中是没有操作系统的,系统编程是在有操作系统的环境下,系统调用就是操作系统提供的接口,就是函数对系统资源访问,这一阶段会讲各种各样的操作系统提供的函数,了解了这些函数去调用,就可以获得操作系统提供的功能了。
这个阶段相对简单,就是调各种操作系统提供的接口函数来实现各种各样的功能,例如多任务之间的通信、同步、互斥等等
1.2系统调用概念
1.21类UNIX系统的软件层次
LINUX操作系统是一个类UNIX操作系统
这个图最核心的是操作系统内核,实现了各种各样的操作系统的功能,在内核外面灰色的被称为系统调用,其实就是内核kernel提供的一些接口,举个例子,如果kernel可以把他认为是一个房间,系统调用相当于一个一个的门口,用户可以通过门进入内核来获取内核提供的服务。
在system calls的外层有shell、library routines、applications。
①shell
可以调操作系统的接口然后进入内核实现一些服务比如shell中有cd命令,没有可执行程序执行CD时要调用change➕R改变目录函数chdrr这个函数进入内核再去进行切换目录。
②library routines
library routines是库,
比如以前学过的库函数F/open,F/read,F/write对文件进行操作,
其实F/open,F/read,F/write这样的函数会去调操作系统提供的接口函数,打开文件的函数,F/open,去调用open,通过调open这个操作系统提供的接口进入内核,内核再去调驱动,驱动去打开硬盘上的文件,所以有些库函数也需要调用操作系统提供的接口,并不是说所有的库函数都要调操作系统提供的接口,实际有些string copy就是通过指针实现的并没有调用操作系统提供的接口,但F/open,F/read,F/write这些函数确实调用了操作系统kernel提供的接口。
③applications
除此之外applications用户编程接口,用户可以通过shell调用系统接口进入内核,可以去调用库函数,库函数再去系统调用进入内核,而且这里有个缺口可以直接调用系统调用进入内核。
这张图很清晰的表示了各个层面之间的关系,这张图要看懂。
系统调用是操作系统提供给用户程序的一组特殊函数接口。
string copy,F/open, string talk这些函数C库给大家提供的接口包含同文件可以直接用,系统调用是操作系统提供的接口,包含对应的同文件也可以直接调用。
Linux的不同版本提供了两三百个系统调用
1.22用户程序可以通过这组接口获得操作系统内核提供的服务
例如:
用户系统可以通过文件系统相关的系统调用请求系统打开文件,关闭文件或读写文件
这张图简单介绍了一下框架,蓝框部分相当于是内核,操作系统提供了五大功能分别是进程管理(管理多任务),内存管理,文件系统,设备控制,网络管理,这五大功能有相应的函数去实现这种管理,内核当中还有些驱动,最终通过驱动去控制底层的硬件,操作系统是装在硬件之上的。
注意:
操作系统这五大功能都留了接口函数,因为箭头都是双向的说明可以传输数据下来调用也可以返回数据,F/write向下写一直写到硬盘上,F/read从硬件一直向上读。
操作系统提供了一些接口函数,这些接口函数是系统调用接口,应用程序通过系统调用接口进入内核再去控制硬件。例如在应用程序中去调用open函数,open函数是一个系统调用进入内核由内核当中的open,再去调用驱动当中的open,最终打开硬盘上的文件。向里面写数据也是从上往下将字符型写到硬盘上,读数据是先进入最终控制硬件最后再将数据返回。
1.23系统调用按照功能逻辑大致可分为
进程控制,进程间通信,文件系统控制,系统控制(操作系统重启),内存管理,网络管理,socket控制(网络通信相关),用户管理
因为Linux操作系统是一个多用户的操作系统
操作系统提供了两三百个系统调用,这两三百个函数按逻辑功能大致可分为这几类。
1.24系统调用的返回值
(系统调用调内核提供的函数,函数都有返回值,要么带返回值要么不带返回值)
通常用一个负的返回值来表明错误,返回一个零值表明成功。错误信息存放在全局变量Error中,用户可用perroor函数打印出错信息
并不是所有的内核函数调用都是这样的,全局变量可以认为是一个整形的全局变量,如果系统调用出错会给整形的全局变量赋值,它的值代表错误类型,perroor库函数会检查error值,根据error值打印相应的出错信息
1.25系统调用遵循的规范
在Linux中,应用程序编程接口API遵循POSIX标准,也就是说Linux系统提供的系统调用编程接口函数遵循这个标准,这个标准规定了操作系统提供的接口函数的名字,参数的个数以及参数的类型,返回值的类型,及函数的功能,Linux UNIX都遵循这个标准,这两种操作系统提供的接口函数就一模一样,写程序时在Linux中写的代码放到UNIX当中一样可以编译,因为接口函数一样。
举个例子:
以前写过mean string copy,只是做了mean string copy一个要求,函数名字必须叫mean string copy,参数必须是两个指针,返回值是一个指针,功能必须是实现字符串拷贝,只要做好了这个规定,大家都去实现mean string copy,内部实现的方法可能不太一样,但是只要把接口给我,谁写的都可以调用,这就是通用。所以我的应用代码就不用改,调谁的都行。所以学Linux操作系统的系统编程可以看UNIX系统编程
POSIX标准基于当时现有的unix实践和经验,描述了操作系统的系统调用编程接口(实际上就是API),用于保证应用程序可以在源代码一级上在多种操作系统上一直运行。
以前写程序时有了标准的好处是写了一个程序比如说写一个最简单的may函数,要调用print f打印hello world,在VC6.0中编译运行代码不用改放在Linux中编译又可以运行,因为Windows支持标准C库Linux也支持标准C库,这就是标准的好处,Linux和UNIX都遵循这个标准,所以操作系统提供的接口函数都是一样的.
如:
Linux 下写的 open,write,read 可以直接移植到 unix 操作系统下.