第7章 进程
7.1进程概述
7.1.1Linux进程
操作系统的定义:进程是一个动态的实体,进程是程序的一次执行过程,是操作系统资源分配的基本单位。
线程:为了让计算机在同一时间内能执行更多任务,在进程内部又划分了许多线程。线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,可以把线程看成操作系统分配CPU时间的基本单位。。
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 协议 ,转载请注明出处!