copy from: http://blog.sina.com.cn/s/blog_759dc36b0100p8y4.html
当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。
系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进程。进程的task_struct数据结构包括了进程的状态、调度信息、进程标识符等信息。
由于UNIX系统是一个多进程的操作系统,所以每一个进程都是独立的,都有自己的权限及任务,所以当某一进程失败时并不会导致别的进程失败。系统通过进程标识符来区分不同的进程,进程标识符是一个非负正数,他在任何时刻都是唯一的,当某个进程结束时,他的进程标识符可以分配给另外一个新进程。系统将标识符 0分配给调度进程,标识符1分配给初始化进程。
进程在运行期间,会用到很多资源,包括最宝贵的CPU资源,当某一个进程占用CPU资源时,别的进程必须等待正在运行的进程空闲CPU后才能运行,由于存在很多进程在等待,所以内核通过调度算法来决定将CPU分配给哪个进程。
系统在刚刚启动时,运行于内核方式,这时候只有一个初始化进程在运行,他首先做系统的初始化,然后执行初始化程序(一般是/sbin/init)。初始化进程是系统的第一个进程,以后所有的进程都是初始化进程的子进程。
UNIX系统使用进程标识符来管理当前系统中的进程。为对具有某类似特性的进程统一管理,系统又引入了进程组的概念,以组标识符来区别进程是否同组。进程的组标识符是从父进程继承下来的,所以,通常进程的组标识符就是和它相关联的注册进程的标识符。进程的标识符是由系统为之分配的,不能被修改;组标识符可通过setpgrp系统调用修改。
相关系统调用的格式如下:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getpgrp(void);
pid_t getppid(void);
pid_t getpgid(pid_t pid);
说明:前三个系统调用分别返回调用进程的进程标识符、进程组标识符和其父进程标识符。它们总能成功地返回。第四个调用置进程组标识符,它将调用进程的进程组标识符改为调用进程的进程标识符,使其成为进程组首进程,并返回这一新的进程组标识符。
下面我们来看一个实例:
|
[root@localhost src]# gcc getpid.c [root@localhost src]# ./a.out PID = 4408 PPID = 3128 [root@localhost src]# |