什么是系统调用

计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口。

参考链接:https://blog.csdn.net/gatieme/article/details/50779184

调用案例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

#define SIZE (20)
int
main(int argc, char *argv[])
{
	pid_t tid;
	tid = syscall(SYS_gettid);
	printf("tid: %lu\n", tid);

	unsigned char buffer[SIZE] = "";
	syscall(SYS_getrandom, buffer, SIZE, 0);
	printf("random unsigned char: ");
	for(int i = 0; i < SIZE; ++i) printf("%02x", buffer[i]);
	printf("\n", buffer);
}

执行的结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
root@dd1a6c93acc2:/tmp# gcc main.c -o main && ./main
tid: 184
random unsigned char: bdbdf292ac511bab766be7cc4002bca5e59150b4
root@dd1a6c93acc2:/tmp# vim main.c
root@dd1a6c93acc2:/tmp# ./main
tid: 186
random unsigned char: 71db26f6f34876a6ce8b652809a646c2d523b0bb
root@dd1a6c93acc2:/tmp# ./main
tid: 187
random unsigned char: b40bd7e3b365c7fbffdfef9bf60b73b1753d0c99
root@dd1a6c93acc2:/tmp#

其他信息

  • 系统调用列表:/usr/include/x86_64-linux-gnu/asm/unistd_64.h,或/usr/include/x86_64-linux-gnu/asm/unistd_32.h
  • SYS_xxx定义:/usr/include/x86_64-linux-gnu/bits/syscall.h