系统调用
1. 系统调用的概念
1.1. 系统调用
程序接口是 OS 专门为用户设置的,提供给程序员编程时使用,由一组系统调用组成,即系统调用提供了用户程序和操作系统之间的接口。
由于系统调用是在用户态运行的应用程序请求 OS 内核完成某种功能的调用,调用过程需要通过中断机制实现,先由用户态转换为内核态,经内核分析后,才能转向相应的系统调用处理子程序;在被调用过程执行完后,此时若调用进程具有最高进程优先级,则调用进程继续执行,否则把调用进程放入就绪队列。
1.2. 系统调用类型
- 进程控制类系统调用:包含创建和终止进程的系统调用、获得和设置进程属性(标识符、优先级等)的系统调用、等待某事件出现的系统调用(一旦某事件出现,则将进程唤醒)。
- 文件操作类系统调用:包含创建与删除文件、打开和关闭文件、读/写文件的系统调用
- 进程通信类系统调用:消息传递方式和共享存储区方式使用的系统调用
- 常用类型还有设备管理类系统调用和信息维护类系统调用
1.3. POSIX 标准
Portable Operating System IX 定义了标准应用程序接口,用于保证编制的应用程序可以在源代码一级上在多种 OS 上移植运行,即兼容多种 OS。
2. UNIX 系统调用
2.1. 进程控制
- 进程创建和终止:一个进程可利用 fork 系统调用来创建一个子进程;一个进程可利用 exit 实现自我终止
- 改变进程映像和等待:exec 可使调用者进程的进程映像(包括用户程序和数据)被一个可执行的文件覆盖;wait 用于将调用者进程自身挂起,直到其某一子进程终止为止
- 其他进程调用: 利用 getp-id 获得调用进程的标识符;利用 getpgrp 获得调用进程的进程组 ID;利用 getppid 获得进程的父进程 ID;利用 getuid 获得真正的用户 ID;geteuid 获得有效用户 ID;getgid 获得真正用户组 ID;pause 可将调用进程挂起,直到收到一个信号为止
2.2. 文件操纵
- 文件的创建和删除:create 可根据用户提供的文件名和许可权方式来创建一个新文件或重写一个已存在文件,随即打开文件并返回文件描述符 fd;无专门的删除文件调用
- 文件的打开和关闭:open 可把有关的文件属性从磁盘拷贝到内存,以及在用户和指明文件之间建立一条快捷通路,并给用户返回一个文件描述符 fd;close 可断开用户程序与该文件的快捷空路,只有文件的索引节点中的访问计数器 count=0 时,才真正关闭文件
- 文件的读和写:仅当用户利用 open 打开指定文件后,方可调用 read 和 write ,都需要文件描述符 fd、buf 缓冲区首址(读的目标地址和写的源地址)和用户要求传送的字节数 nbyte
- 建立与文件的连接和去连接:每当一个用户要共享某文件时,须利用 link 来建立该用户(进程)与此文件之间的连接,并对文件索引节点的连接计数器 i.link 加1;当一个用户不再使用共享某文件时,须利用 unlink 来断开连接,并对 i.link 减1,当 i.link=0 时才能将该文件从文件系统中删除
2.3. 进程通信
- 消息机制:用户(进程)利用消息机制通信时,须利用 msgget 建立一个消息队列,若成功则返回消息队列描述符 msgid;用户可利用 msfsend 向用户指定的消息队列发送信息,用 msgrcv 从指定的消息队列中接收指定类型的消息
- 共享存储器机制:用户(进程)利用共享存储机制进行通信时,须利用 shmget 建立一个共享存储区,若成功则返回共享存储区描述符 shmid;用户可利用 shmat 将该共享存储区连接到本进程的虚拟地址空间上,用 shmdt 来拆除进程与共享存储区间的连接
- 信号量机制
2.4. 信息保护
- 设置和获得时间:一般用户可用 time 获得当前时间;超级用户可用 stime 设置系统的日期和时间
- 获得进程和子进程时间(times):可用 times 获得进程及其子进程所使用的 CPU 时间(包括调用进程在用户空间执行指令所花时间、系统为调用进程所花的 CPU 时间、子进程在用户空间所有 CPU时间和系统为各子进程所花 CPU 时间等),并将时间填写到一个指定缓冲区
- 设置文件访问和修改时间(utime):若该系统调用的参数 times 为 NULL,则文件主和具有写权限的用户可对该文件的访问和修改时间设置为当前时间;若 times 不为 NULL,则把 times 解释为指向 utim buf 结构的指针,文件主和超级用户能访问和修改时间置入 utim buf 结构中
- 获得当前 UNIX 系统名称(uname):可利用 uname 将有关 UNIX 系统的信息存储在 utsname 结构中
3. ChangeLog
2018.09.26 初稿