一张图讲解Linux的系统调用

目录

一、进程管理

二、内存管理

三、文件管理

四、信号处理

五、进程间通信

六、网络通信

七、glibc


一张图讲解Linux的系统调用

 

一、进程管理

1、创建进程的系统调用叫fork;

2、创建一个新的进程需要老的进程调用fork来实现,其中老的简称叫父进程,新的进程叫子进程

3、当父进程调用fork创建进程的时候,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份;如果不进行特殊处理,父进程和子进程按照相同的程序执行下去,

4、需要根据fork系统调用的返回值来判断进程是子进程还是父进程。对于fork系统调用的返回值,如果是子进程返回0,如果是父进程,返回子进程的进程号。

5、父进程通过waitpid可以确定子进程的状态,通过将子进程的进程号作为参数传递给waitpid可以得知子进程是否运行完成。

 

二、内存管理

1、每个进程都有独立的进程内存空间

2、内存空间分为:存储代码的代码段和存储进程产生数据的数据段

3、对于数据段,局部变量部分执行完某函数就会释放内存,也会有动态内存分配

4、进程的内存是在需要的时候进行分配的,其中分配的并不是真实的物理内存,只有在写入数据的时候才会触发中断分配物理内存;

5、当分配的内存数量比较小的时候使用brk分配;

6、当分配的内存数量大的时候使用mmap分配一块大的内存。

 

三、文件管理

1、对于已经有的文件使用open打开文件、close关闭文件;

2、对于没有的文件使用creat创建文件;

3、打开后的文件使用lseek跳到文件的某个位置;

4、对文件的内容进行读写,读的系统调用是read、写的系统调用是write;

5、一切皆文件,启动进程需要的是二进制文件、加载配置是文本文件、访问的是设备文件    等;

6、每个文件,Linux都会分配一个文件描述符,是一个整数,通过文件描述符可以使用系统调用;

 

四、信号处理

 1、当程序遇到异常时需要发送一个signal给系统;

 2、CTRL+C是一个中断信号,正在执行的命令会退出;

 3、非法访问内存和硬件故障都会报错;

 4、用户可以通过kill函数,将一个用户信号发送给另一个进程;

 5、SIGKILL(用于终止一个进程的信号)和 SIGSTOP(用于中止一个进程的信号)

 6、每种信号都定义了默认的动作,例如硬件故障,默认终止;也可以提供信号处理函数,可以通过sigaction系统调用,注册一个信号处理函数

 

五、进程间通信

1、msgget创建一个消息队列;

2、msgsnd将消息发送给消息队列;

3、消息接收方通过msgrcv从队列中取消息;

4、如果交互信息比较多,通过共享内存的方式进行通信,shmget创建共享内存,shmat将共享内存映射到自己的内存空间

伪代码:

假设信号量为1

signal = 1

sem_wait伪代码

while True {

if sem_wait == 1;

    signal -=1;

    break;

}

code.code;

sem_post伪代码

signal +=1;

 

六、网络通信

网络插口:socket

网络协议:TCP/IP网络协议

 

七、glibc

1、为程序员提供丰富的API,封装了操作系统的系统服务,即系统调用的封装;

2、Glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。

  1.