一、进程三种状态
1.就绪状态(Ready)
当进程已分配到除CPU以外的所有必须的资源,只要获得处理机便可以立即执行,这时的进程状态就被称为就绪状态。
2. 执行状态(Running)
当进程已获得CPU,其程序正在CPU上执行,此时的进程状态被称为执行态。
3. 阻塞状态(Blocked)
又称为等待、挂起状态。
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件有很多种,例如,等待I/O完成、申请缓存区不能满足、等待条件(信号)等。
4. 状态转换
处于阻塞态的进程在事件发生后不会直接进入到运行态,而是先进入到就绪态。
二、进程相关命令
1. ps查看进程
一般使用 ps -aux(进程状态) 或 ps -ef(父子进程关系)
使用ps命令时查看的进程状态标记符
R:正在执行
S:阻塞状态
T:暂停状态
Z:僵尸进程(不存在但暂时无法消除)
D:不可中断的进程
<:高于优先级的进程
N:低于优先级的进程
L:有内存分页分配并锁在内存中
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组
2. kill消灭进程
一般使用 kill -9 pid 消灭指定进程 (类似于Ctrl+c)
(给进程ID为pid的进程发送一个编号为9的信号)
kill命令本质是给一个指定的进程发送一个信号。
信号分为很多种,大多数情况下,进程接收到信号后会结束运行。进程中可以更改对信号的处理方式,但是无法更改对9、19信号的处理方式,防止特殊情况发生无法终止进程。
三、相关函数
1.相关头文件
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
2.获取进程ID
grtpid()
原型:pid_t getpid(void);
返回值:成功,当前进程的ID
getppid()
原型:pid_t getppid(void);
返回值:成功,当前进程的父进程ID
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
int main(void)
{
pid_t pid,ppid;
pid = getpid();
ppid = getppid();
printf("pid = %d\r\nppid = %d\r\n",pid,ppid);
}
3.运行进程
system()
在一个进程中运行另一个进程,运行完后回到原进程
原型:int system(const char * string); 参数:const char * string
待执行的命令(以字符串的形式),比如 “ls -l” 功能:system()会调用 fork()产生子进程,由子进程来调用/bin/sh-c
string 来执行参数 string 字符串所代表的命令,此命令执行完后随即返回 原调用的进程。在调用 system()期间
SIGCHLD 信号会被暂时搁 置,SIGINT 和 SIGQUIT 信号则会被忽略
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
int main(void)
{
pid_t pid,ppid;
pid = getpid