Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3351924
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类: C/C++

2011-12-22 16:13:33

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

(2)getppid()
功能:用来获取目前进程的父进程标识。
定义函数:pid_t getppid(void)
返回值:返回当前进程的父进程识别号。
头文件:#include

(3) getuid()
功能:获得进程的实际用户ID
定义函数:pid_t getuid(void)
返回值:返回进程的实际用户ID
              实际用户ID(uid) :标识运行该进程的用户
例如:一个普通用户A,运行了一个程序,而这个程序是以root 身份来运行的,则程序运行时就具有root 权限。此时,实际用户ID时A用户的ID,而有效用户ID是root用户ID
头文件:#include

(4) geteuid()
功能:获得进程的有效用户ID
定义函数:pid_t geteuid(void)
返回值:返回进程的有效用户ID
头文件:#include

(5)getpgid()
功能:用来获得参数pid指令进程所属于的组识别号,若参数为0,则返回当前进程的组识别码。
定义函数:pid_t getpgid(pid_t pid)
返回值:执行成功则返回正确的组识别码,若有错则返-1,错误原因存在于errno中。
头文件:#include

(6)getpgrp()
功能:用来获得目前进程所属于的组识别号,等价于getpgid(0)。
定义函数:pid_t getpgrp(void)
返回值:执行成功则返回正确的组识别码。
头文件:#include

(7)getpriotity(void)
功能:用来获得进程,进程组和用户的进程执行优先权。
定义函数:int getpriority(int which,int who)
参数含义:
which:
PRIO_PROCESS   who为进程的识别码
PRIO_PGRP     who为进程的组识别码
PRIO_USER     who为用户识别码
返回值:执行成功则返回当前进程的优先级(-20--20),值越小优先级越高。若出错则返-1,原因在errno中。
头文件:#include

3.代码举例
3.1 获取当前进程的PID信息
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/resource.h>

  4. int main(int argc,char **argv)
  5. {
  6.       printf("This process's pid is:%d",getpid());
  7.       printf("/nThis process's farther pid is:%d",getppid());
  8.       printf("/nThis process's group pid is:%d",getpgid(getpid()));
  9.       printf("/nThis process's group pid is:%d",getpgrp());
  10.       printf("/nThis process's priority is:%d/n",getpriority(PRIO_PROCESS,getpid()));
  11.       return 0;
  12. }


参考文献
阅读(5983) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~