常用系统调用
进程管理
-
fork 是创建进程的系统调用。在 Linux 中创建一个新的进程,需要父进程调用 fork 来实现。当 fork 创建子进程之后,子进程的所有东西包括程序代码都是跟父进程一样的。也就是说,父子进程都将从调用 fork 处返回,但是不同的是父进程调用 fork 之后,返回值是子进程的进程号(非 0 值);子进程调用 fork 之后,返回的值是 0。根据返回值来判断当前进程应该怎么做,如果是父进程则继续执行,如果是子进程则通过系统调用 execve 来加载新的程序。
-
waitpid,父进程可以使用 waitpid 并将子进程的进程号作为参数传进去,就可以知道子进程运行完了没有。
内存管理
- brk 和 mmap 是负责在堆中分配内容的两个系统调用。分配的内存数量比较小的时候,使用 brk,会和原来的堆的数据连在一起。分配的内存数量比较大的时候,使用 mmap,会重新划分一块区域。
文件系统
- 对于已经有的文件,使用 open 打开这个文件,close 关闭这个文件;
- 对于没有的文件,使用 creat 创建文件;
- 打开文件以后,使用 lseek 跳转到文件的某个位置;
- 文件内容的读写,使用 read 和write
在 Linux 中有一个特点,那就是一切皆文件,一切皆文件的优势就是统一了操作的入口,提供了遍历,使用相同的操作即可。Linux 会为每个文件分配一个文件描述符(File Descriptor),这是一个整数。
- 二进制程序文件是文件;
- 文本文件是文件;
- 内存输出到控制台上,控制台也是文件,stdout 文件。
- 一个进程的输出可以作为另一个进程的输入,这种方式称为管道,管道也是一个文件;
- 进程通过网络与其他进程进行通信,建立的 socket 也是文件;
- 进程访问外部设备时,外部设备也是文件;
- 文件被存储在文件夹中,文件夹也就是目录也是一个文件;
- /proc 下面存放着进程的运行情况,也是一系列文件;
信号处理
-
kill 发送信号给另一个进程。
-
sigaction 系统调用注册一个信号处理函数。
操作系统中以下这几种情况会使用信号:
- 在执行一个程序的时候,在键盘按下“CTRL+C”,就会触发中断的信号,正在执行的命名就会中止退出。
- 非法访问内存
- 硬件故障
- 用户使用 kill 函数
进程间通信
- 消息队列的方式。适合数据量不是特别大的情况,消息队列是在内核里的,msgget 系统调用创建一个新的队列,msgsnd 系统调用将消息发送到消息队列,msgrcv 从消息队列中取消息。
- 共享内存的方式。适合交互信息量比较大的情况。shmget 创建一个共享内存块,shmat 将共享内存块映射到自己的内存空间。
- 信号量机制 semaphore。sem_wait 占用信号量,sem_post 释放信号量。
网络通信
- socket 系统调用可以创建一个 socket,socket 也是一个文件,也有一个文件描述符。需要网络通信的双方都需要创建一个 socket。
Linux 内核有对 TCP/IP 网络协议栈的实现,并使用套接字 socket 来提供网络服务。
巨人的肩膀
- 极客时间-《趣谈Linux操作系统》