第三章 系统编程介绍
系统编程介绍
系统编程与应用编程
- 系统编程
ㅤ ㅤ在操作系统之上利用系统调用、C库进行对系统资源进行访问。如 apache、gcc、gdb等
- 应用编程
ㅤ ㅤ在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、 iphone程序(iphone sdk)、QT程序设计(QT)、MFC程序设计(MFC)等.
系统资源
- 处理器
- 输入输出
- 进程管理
- 内存
- 设备
- 定时器
- 进程间通信
- 网络
系统调用
ㅤ ㅤ所有操作系统都提供多种服务的入口点,由此程序向系统核请求务。这些入口点被称之为系统调用(svstem call),
系统调用与C库关系
C库
ㅤ ㅤ这里我们所说的C库(libc),指的是标准C定义的C函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。
ㅤ ㅤGNU发布的libc称为glibc
系统调用与C库关系
ㅤ ㅤ系统调用与C库从形式上来看都C函数
ㅤ ㅤC库函数有些是调用系统调用来实现的,比如说malloc、free调用brk, printf调用 write系统用,有些函数不需要任何系统调用,比如abs、strcpy、atoi等,因为它并不是必需要使用内核服务
ㅤ ㅤ系统调用通常提供的是最小界面,而C库函数通常提供更复杂的功能。
内核如何处理系统调用
- 每个系统调用被赋予一个系统调用号
- 在i386平台上,执行一个系统调用是通过int 0x80指令完成的。
- eax存放系统调用号
- ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器指向用户空间存储所有系统调用参数的缓存。
错误处理
ㅤ ㅤ在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述。
ㅤ ㅤerrno这个全局变量在<errno.h>头文件中声明如下:extern int errno;
错误处理函数
- perror
- strerror
错误码 | 解释 |
---|---|
E2BIG | 参数列表太长 |
EACCESS | 权限不足 |
EAGAIN | 重试 |
EBADF | 错误的文件描述符 |
EBUSY | 设备或资源忙 |
ECHILD | 无子进程 |
EDOM | 数学参数不在函数域内 |
EEXIST | 文件已存在 |
EFAULT | 地址错误 |
EFBIG | 文件太大 |
EINTR | 系统调用被中断 |