1.进程状态概述 在linux中通过task_struct结构体来描述进程的PCB,我们可以在include/linux/sched.h中看到对进程task_struct的定义和进程状态的描述。 在include/linux/sched.h 中我们可以看到Linxu中进程状态的具体实现: #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_ZOMBIE 4 #define TASK_STOPPED 8 其中: TASK_RUNNING,运行状态:进程正在运行或在运行队列中等待运行 。 TASK_INTERRUPTIBLE,可中断等待状态:进程正在等待某个事件完成(如等待数据到达)。等待过程中可以被信号或定时器唤醒。 TASK_UNINTERRUPTIBLE,不可中断等待状态:进程正在等待某个事件完成并且等待中不可以被信号或定时器唤醒,必须一直等待到事件发生。 TASK_ZOMBIE,僵死状态:进程已终止,但进程控制块尚未注销,进程描述符依然存在,直到父进程调用wait()函数后释放。 TASK_STOPPED,挂起/停止状态:进程因为收到SINSTOP,SIGSTP,SIGTIN,SGIOU信号后停止运行或者该进程正在被跟踪。 2.进程的基本信息获取 主要通过读取进程控制块PCB中的信息。 (1)getpid() 功能:用来获取目前进程的进程标识。 定义函数:pid_t getpid(void) 返回值:返回当前进程的进程识别号。 头文件:#include <unistd.h> (2)getppid() 功能:用来获取目前进程的父进程标识。 定义函数:pid_t getppid(void) 返回值:返回当前进程的父进程识别号。 头文件:#include <unistd.h> (3) getuid() 功能:获得进程的实际用户ID 定义函数:pid_t getuid(void) 返回值:返回进程的实际用户ID 实际用户ID(uid) :标识运行该进程的用户 例如:一个普通用户A,运行了一个程序,而这个程序是以root 身份来运行的,则程序运行时就具有root 权限。此时,实际用户ID时A用户的ID,而有效用户ID是root用户ID 头文件:#include <unistd.h> (4) geteuid() 功能:获得进程的有效用户ID 定义函数:pid_t geteuid(void) 返回值:返回进程的有效用户ID 头文件:#include <unistd.h> (5)getpgid() 功能:用来获得参数pid指令进程所属于的组识别号,若参数为0,则返回当前进程的组识别码。 定义函数:pid_t getpgid(pid_t pid) 返回值:执行成功则返回正确的组识别码,若有错则返-1,错误原因存在于errno中。 头文件:#include <unistd.h> (6)getpgrp() 功能:用来获得目前进程所属于的组识别号,等价于getpgid(0)。 定义函数:pid_t getpgrp(void) 返回值:执行成功则返回正确的组识别码。 头文件:#include <unistd.h> (7)getpriotity(void) 功能:用来获得进程,进程组和用户的进程执行优先权。 定义函数:int getpriority(int which,int who) 参数含义: which: PRIO_PROCESS who为进程的识别码 PRIO_PGRP who为进程的组识别码 PRIO_USER who为用户识别码 返回值:执行成功则返回当前进程的优先级(-20--20),值越小优先级越高。若出错则返-1,原因在errno中。 头文件:#include <sys/resource.h> 3.代码举例 3.1 获取当前进程的PID信息
|
|