Linux编程模型
- 不同的操作系统具有不同的系统调用接口
- 从用户空间到内核空间的切换原理上是通过系统调用接口来实现的,本质上是由于硬件提供的软中断来实现的。
- 系统调用越频繁,软中断触发的次数越多,效率则会更低
- 用户空间和内核空间不能直接访问,否则会出现段错误
几个重要概念
用户空间和内核空间
- 在32位系统中,4G的虚拟空间(User:3G+Kernel:1G)
- 空间相互独立,不能直接访问
系统调用syscall
- 用户空间访问内核空间的唯一接口
一切皆文件
- Unix系统设计的思想
文件描述符
对于内核而言,所有打开的文件都由文件描述符来引用
- 普通文件、管道、socket
文件描述符是一个顺序分配的非负整数
- 打开或创建一个文件时,内核向进程返回一个文件描述符
在Posix标准中,宏定义在头文件<unistd.h>中,如:
- 整数0:STDIN_FIENO
- 整数1:STDOUT_FIENO
- 整数2:STDERR_FIENO
eg:但是对于系统调用,有时候不知道某些函数的用法及属于哪些头文件
如何获取帮助信息
- 工具:man手册
- 特点:
- 总共有7本帮助手册
- 每本的作用域不同
- 1:常用命令 2:系统调用 3:通用函数
- 查找命令:man+数字+函数名
- 如果是值man+函数名,如:man write
- man 2 write
- man 后面的命令的数字是1-7,常用的是前3本,前面有提到3个数字的意思。
- 如果是值man+函数名,如:man write
怎么看,如:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
向一个对象写一段数据
size_t :这是被typedef重命名的数据类型,意义在于让调用者见名之意
意义是内存大小,单位 B,size_t一般是32位,ssize_t一般是64位
其他的:time_t mode_t
fd:文件描述符
例子:
#include <stdio.h>
#include <unistd.h>
int main(){
int ret;
ret = write(1,"hello world",11);
if(ret ==-1){
perror("write")
}
printf("\n====%d\n",ret);
return 0;
}
系统调用接口和库函数的区别
系统调用只有唯一的函数,库函数可以调用系统调用函数也可以不调用系统调用函数或者可以调用多个系统调用函数