← 返回首页
Linux高级程序设计(十五)
发表时间:2021-11-07 12:05:21
系统调用的概念

系统调用是操作系统提供给用户程序调用的一组“特殊”接口,可被看成是内核(kernel)与用户空间程序交互的接口,用户程序可以通过系统调用来获得操作系统内核提供的服务,从而实现让应用程序有限地使用硬件资源。

Linux的内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。正是因为有kernel的存在,进而限制了应用程序的一些危险访问(基于权限、用户类型和一些规则),保证系统安全稳定性。

通过内核(kernel)Linux把运行空间分为内核空间与用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数printf就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。

1.系统调用的作用

2.系统调用的三种方式

3.系统调用分类

不同的linux版本提供了两三百个不同的系统调用接口。如下图所示:

按照功能逻辑大致划分如下:

4.POSIX标准

POSIX: Portable Operating System Interface of Unix.,可移植操作系统接口。X表示其是对Unix API的传承。

简单来说,POSIX可理解为操作系统设计API时遵循的规范,一套规范的系统调用集。例如:不同操作系统内核为同一功能提供的系统调用(函数)是不同的,例如创建进程,linux下是fork函数,windows下是createprocess函数,如果在Linux下写了一个程序用到了fork函数,要往windows上移植就得把源代码里面的fork通通改成createprocess,然后重新编译。解决办法就是定义POSIX标准,让linux和windows都实现基于POSIX标准,提供同样的接口,例如定义创建进程的接口为posix_fork(示例名/非真实名字), 且linux和windows都把各自创建进程的调用封装成posix_fork,都声明在unistd.h里。 这样程序员编写应用时,只需包含unistd.h, 调用这个POSIX标准中定义的API接口: posix_fork函数,即可实现源代码级别的可移植。