|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
进程指正在运行的程序,资源分配的最小单位,可以通过“ps ”或“top”等命令查看正在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此进程的同一资源。本章代码在process/目录下。- M+ ^9 z8 M. f0 d3 y* w* H+ P
进程类型:/ y* }4 p" |0 I3 l p, u$ O, g
1.交互进程:由shell启动,用户和计算机进行问答的进程。+ a/ F& s3 S2 R* x+ a. e& f
2.批处理进程:不与特定终端相关联,将任务提交到等待队列按顺序执行的进程。- n }1 ]; [# e. I0 G
3.守护进程:后台运行的特殊进程,用户不能和它进行会话。
- q+ `7 ~" D$ x3 u3 \! G2 h进程的三种状态: J+ J0 c% E$ l' A6 a, Z/ ?2 e
5 \& \( G7 C0 d- K
1.运行态,正在运行或在运行队列中等待。
( `" ]; Q P% V) _5 @( z0 w2.可中断等待态,休眠, 在等待申请的资源有效或等待中断,信号唤醒。% y; y4 Q1 }# {: O9 X5 @/ R
3.不可中断等待态,休眠等待资源有效,不能被中断或信号唤醒。0 w# t! E! j. ?( ~* p
4.终止态,进程被停止或者被跟踪状态,收到SIGCONT信号时,又会恢复运行状态。
! @8 k+ p$ Y7 }, [5.僵尸态,进程因某种原因而中止运行,但进程描述符仍存在,不可被Kill。
7 x& c; k) b% j+ g$ R如果想销毁某一进程,可在终端输入“ps -elf”查看进程号,如图 66.2:
3 S9 q6 |6 n6 c ) X3 o. N% z+ {: ]
如果要销毁qtcreator进程,使用“kill -9 3001”可以销毁它,
9 ^1 }* B5 I+ W9 O+ ]+ _' } # n& f; x: X) }2 T/ i1 e
1进程创建
3 W5 ]3 f. ^! w# Z8 L k. A所有的进程都是由其他进程创建(除了pid为0号的idle进程),pid号为1的init进程是系统启动后运行的第一个进程,是所有进程的父进程,init进程会初始化一部分系统服务,创建其他进程。
3 k5 r6 G9 M6 \0 q; f8 @) a创建新进程的那个进程称为父进程,新进程称为子进程,父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。" Q! C, m$ F. ^0 S/ d
子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。
$ c _" r8 n( r( v1 S) o如果父进程先结束,子进程会被init进程收养,称为孤儿进程。
9 L# F3 j- i# F# u: v- _终端输入“ps -el”查看进程状态,PID为进程号,PPID为此进程的父进程号,如图 1.1,1505号进程的父进程为1366进程。
7 ^% [% y8 U" P, s8 p3 s % Y" L. m, W' r: Y8 U5 N
![]()
1 y) I& }- P) ?3 e% Jgetpid():获取进程PID,
% S7 |0 Z/ l$ }' j9 ^3 S * w( Z8 `& M0 D. s
返回值为PID号。' p, Y1 L4 w3 Y. h
fork():系统调用,创建一个进程,
* @$ T6 E! a) D: f9 K#include8 c8 a4 }7 L: a% p
pid_t fork(void);
' T% c0 O7 A# _调用成功父进程返回子进程号,子进程返回0,失败返回-1。 |6 o1 t8 Y5 F
如以下代码:
1 f |) \" g) Q! S* e+ e5 ufor.c:8 g3 H4 g/ y7 P' m% ?
![]()
7 g7 x5 w) H; _, D' A# k3 m打印结果:
% w/ x' u- g0 D5 v. {- L1 ^![]()
: O4 M" v, }4 Z0 V; }5 v) ^程序执行过程中第一次调用fork()进程2531创建子进程2532;第二次fork(),进程2531创建子进程2533,进程2532创建2534,创建过程如图 1.3:* ~) C: D5 E9 a& A" B& E
![]()
9 F' u) L L! {, z% g1 L & Z/ K w& q1 ]7 O6 \! `! k
|
|