目录

Linux 常用系统调用

常用系统调用

https://img.dawnguo.cn/All/ffb6847b94cb0fd086095ac263ac4ff0.jpg

进程管理

  • 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 来提供网络服务。

巨人的肩膀

  1. 极客时间-《趣谈Linux操作系统》