简单的说,进程是处于运行状态的程序,一个运行着的程序可能有多个进程。
进程一般分为交互进程、批处理进程和守护进程三类。守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。
进程的属性
进程标志符:进程ID,内核分配,该标志符非负,范围0~32767
父进程和父进程ID(PPID)
启动进程的用户ID(UID)和所归属的组(GID);
进程的有效用户ID和有效组ID
进程的进程组ID:一个进程可以属于某一个进程组。
进程的会话ID:每一个进程都属于惟一的会话。
进程状态:状态分为运行R、休眠S、僵尸Z;
进程执行的优先级;
进程所连接的终端名;
进程资源占用:比如占用资源大小(内存、CPU占用量);
获得linux进程属性的函数
getpid(void) 获取当前进程ID
getppid(void) 获取当前进程的父进程ID
getpgrp(void) 获取当前进程的进程组ID
getpgid(pid_t pid) 获取进程组ID
getuid(void) 获取当前进程的用户ID
geteuid(void) 获取当前进程的有效用户ID
getgid(void) 获取当前进程的用户组ID
getegid(void) 获取当前进程的有效用户组ID
getsid(pid_t pid) 获取当前进程的会话ID
例子:
相应的有设置进程属性的函数
int setpgid(pid_t pid,pid_t pgid)
setpgid()将参数pid 指定进程所属的组ID设为参数pgid 指定的组识别
码。如果参数pid 为0,则会用来设置目前进程的组ID,如果参数pgid为0,则会以
目前进程的进程ID来取代。
int setpgrp(void)
setpgrp()将目前进程所属的组ID设为目前进程的进程ID。此函数相当于调用setpgid(0,0)。
pid_t setsid(void)
setsid函数,调用该函数的进程将作为新会话的领导者创建一个新的会话,
会话和调用进程的进程组ID,将被设置为调用进程的进程ID,并返回该进程ID
int setuid(uid_t uid) 设置进程的用户ID
int setreuid(uid_t ruid, uid_t euid) 将进程的实际用户ID设置为ruid,有效用户ID设置为euid
int seteuid(uid_t uid) 设置进程的有效用户ID为uid
int setgid(gid_t gid) 设置进程的组ID
int setregid(gid_t rgid, gid_t egid) 将进程的实际组ID设置为rgid,有效组ID设置为egid
int setegid(gid_t gid) 设置进程的有效组ID
其中的函数可参看usr/include/unistd.h中的内容。
进程状态:运行状态,等待状态,暂停状态,僵尸状态,退出状态。
运行状态(RUNNING):进程正在执行,或处于就绪状态
等待状态(SLEEPING):等待某事件的发生或者等待某种资源
暂停状态(STOPPED):进程收到某个信号,暂时停止运行
僵尸状态(ZOMBIE):表示进程结束但尚未消亡的状态
进程优先级:
linux系统为多进程同时运行,Linux采用了时间片轮转的进程调度方式。进程的优先级定义了进程被
调度的优先顺序,优先级的数值越低,其优先级就越高。
Linux用nice系统调用来修改进程的优先级,默认情况下,进程的优先级为0,系统允许的优先级的
范围为:-20~20
int nice(int inc)
nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。
只有超级用户才能使用负的inc值,代表优先顺序排在前面,进程执行会较快。
返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中。
错误代码 EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。
nice系统调用只能用于修改进程自身的优先级。
setpriority(设置程序进程执行优先权)
定义函数 int setpriority(int which,int who, int prio);
函数说明 setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数
who则依which值有不同定义
which who 代表的意义
PRIO_PROCESS who为进程ID
PRIO_PGRP who为进程的组ID
PRIO_USER who为用户ID
参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。
此优先权默认是0,而只有超级用户(root)允许降低此值。
返回值 执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。
EPERM 权限不够,无法完成设置
EACCES 一般用户无法降低优先权
int getpriority(int which,int who);
函数说明 getpriority()可用来取得进程、进程组和用户的进程执行优先权。
参数 which有三种数值,参数who 则依which值有不同定义
which who 代表的意义
PRIO_PROCESS who 为进程ID
PRIO_PGRP who 为进程的组ID
PRIO_USER who 为用户ID
此函数返回的数值介于-20 至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。
返回值 返回进程执行优先权,如有错误发生返回值则为-1 且错误原因存于errno。
附加说明 由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最好在调用次函数前先清除errno变量。
错误代码 ESRCH 参数which或who 可能有错,而找不到符合的进程。EINVAL 参数which 值错误。
创建进程
int fork( void );
返回值:
子进程中返回0,父进程中返回子进程ID,出错返回-1
函数说明:
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。
fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。
注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
pid_t wait (int * status);
函数说明
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。
子进程的结束状态值请参考下面的waitpid()。
返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
pid_t waitpid(pid_t pid,int * status,int options);
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。
函数说明
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。参数pid 为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid 的子进程。
参数option 可以为0 或下面的OR 组合:
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真。
WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。
可参见http://linux.chinaitlab.com/c/804149.html
本文有借鉴其中的内容