第7章 进程

7.1进程概述

7.1.1Linux进程

操作系统的定义:进程是一个动态的实体,进程是程序的一次执行过程,是操作系统资源分配的基本单位。

线程:为了让计算机在同一时间内能执行更多任务,在进程内部又划分了许多线程。线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,可以把线程看成操作系统分配CPU时间的基本单位。。

image-20200519143719469

image-20200519143855159

image-20200519143831350

7.2进程操作

创建进程有两种方式:系统创建和父进程创建。前者创建的是平等的,它们之间一般不存在资源继承关系。

系统调用fork是创建1个新进程的唯一方法(创建1个进程也称fork1个进程),除了init进程它是内核启动时以特殊方式创建的。

一个刚刚被fork的子进程会和它的父进程一样,继续执行当前的程序。

7.2.1创建进程

1.fork函数

  • 非常特殊,fork成功时它有2个返回值:

    • 1个是父进程调用fork函数后的返回值,为子进程的ID
    • 1个是子进程中fork函数的返回值,为0
  • fork之后是父进程还是子进程先执行取决于内核的调度算法.

  • 子进程会继承父进程的很多属性,主要有:用户ID,组ID,当前工作目录,根目录,打开的文件。共享的存储端等

2.孤儿进程

如果1个父进程先于子进程结束,子进程有称为1个孤儿进程,它由init进程收养,是指Init成为它的父进程.

3.vfork函数

  • vfork一个进程时,vfork保证子进程先运行,当它调用exec或exit后,父进程才可能被调度运行.
  • vfork一个进程时,OS不会将父进程的地址空间完全复制到子进程,而是共享父进程的地址空间,子进程对该地址空间中任何数据的修改为父进程所见
  • fork是一个开销很大的系统调用
ps ps aux:

7.2.2 创建守护进程

7.2.3 进程退出

Linux系统中进程退出的方法:

1.正常退出

  • main函数中执行return
  • 调用exit函数
  • 调用_exit函数

2.异常退出

  • 调用abort函数
  • 进程收到终止进程的信号

注 不管哪种退出方式,最终都会执行内核中的同一段代码。它用来关闭进程所有打开的文件描述符,释放它所占用的内存和资源。

各种退出方式的比较

  • exit(int exit_code):参数为0表示进程正常终止,其他值表示有错误发生,比如溢出,除数为0

7.2.4 执行新程序

系统调用exec用于执行一个可执行程序以代替当前进程的执行映像.

注:exec调用并没有生成新进程,系统把代码段换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段和堆栈段,唯一保留的是进程ID

Linux下,exec函数族有6种不同的调用形式,它们的声明在头文件<unistd.h>中

env命令

7.2.5 等待进程结束

wait函数使父进程暂停执行(挂起等待),直到它的一个子进程结束为止。返回终止运行的子进程的PID。

参数statloc所指向的遍历存放子进程的退出码,即子进程main函数的返回值或子进程中exit函数的参数。

7.3进程的其他操作

7.3.1获得进程的ID

7.3.2setuid和setgid

7.3.3改变进程的优先级


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!