Linux下系统调用
知识点
操作系统的进程空间有用户态和系统态,它们具有不同的执行权限。系统调用是指运行在用户态的进程向操作系统内核态请求获得更高的运行权限而能够受限访问硬件设备(比如CPU、打印机)。
当发生系统调用时,CPU通过软中断切换到内核态开始执行内核系统调用函数。
使用syscall调用
也是这次在webserver项目中接触用到。
在unistd.h
的头文件中定义有syscall函数,其中第一个参数为系统调用号,在sys/syscall.h
的文件中定义有系统调用标识号。
int syscall(int, ...);
如下示例,Linux中每个进程都有一个pid,返回类型为pid_t,可以通过SYS_gettid获取。
#include <sys/syscall.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main(int argc, char *argv[]) {
pid_t tid;
tid = syscall(SYS_gettid);
std::cout << "tid:" << tid << std::endl;
return 0;
}
glibc库函数
glibc是一种C函数库,是程序运行时使用到的一些API集合,它们一般是已预先编译好,以二进制代码形式存在Linux类系统中。(即封装好接口可以直接调用)
glibc提供的系统调用API与内核特定的系统调用之间的关系:
每个特定的系统调用对应了至少一个 glibc 封装的库函数,如系统提供的打开文件系统调用 sys_open 对应的是 glibc 中的 open 函数;
int open(const char *pathname, int flags, mode_t mode)
glibc 一个单独的 API 可能调用多个系统调用,如 glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用;
多个 API 也可能只对应同一个系统调用,如glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。
参考文章Linux 下系统调用的三种方法