分享
 
 
 

UNIX高级环境编程(11)进程控制(Process Control)- 进程快照,用户标识符,进程调度

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: |||超大  

UNIX高级环境编程(11)进程控制(PRocess Control)- 进程快照,用户标识符,进程调度

1 进程快照(Process Accounting)当一个进程终止时,内核会为该进程保存一些数据,包括命令的小部分二进制数据、CPU time、启动时间、用户Id和组Id。这样的过程称为process accounting,本篇译为进程快照。

函数acct可以打开或关闭进程快照功能。

负责记录快照的数据结构如下所示:

成员说明:

ac_flag成员记录进程执行过程中的特定事件(稍后的表中会详细说明);进程创建时,初始化进程快照的数据在进程表(process table)中,但是只有在进程终止才会写进程快照。这样的机制导致了两个结果:如果进程不终止,我们无法获取进程快照进程快照文件的顺序依赖于进程终止的顺序,而不是进程被创建的顺序进程快照对应一个进程,而不是程序。进程快照在进程被创建(fork)的时候被初始化,而不是程序被执行时,所以如果我们有一个程序链:A execs B, B execs C然后C退出,则只有一个进程快照被保存。命令的名字是程序的C决定,而CPU时间这类信息则是ABC的总和。ac_flag不同的取值代表的事件含义如下表所示:

2 用户标识符(User Identification)进程可以知道它的真实用户和组(real user ID and group ID),有效用户和组(effective user ID and group ID)。

然后有时候我们想知道运行程序的登录用户名。函数getpwuid可以实现。

函数声明:

#include <unistd.h>

char* getlogin(void);

// Returns: pointer to string giving login name if OK, NULL on error

函数细节:

如果进程并没有和一个终端关联,即没有一个登录用户,则该函数失败,不和终端关联的进程被称为daemon有了登录用户名,我们可以在passWord文件中找到该用户,然后确定登录终端,例如使用getpwnam函数。

3 进程调度(Process Scheduling)nice值决定了进程的运行优先级。

取值范围:0 ~ (2 * NZERO -1)

nice值越低,优先级越高。

意思就是:进程越好,进程的优先级越高。

nice值的默认值为NZERO。

函数nice可以获取并修改nice值。

进程调用nice函数只能修改它自己的nice值。

函数声明:

#include <unistd.h>

int nice(int incr);

// Returns: new nice value - NZERO if OK, -1 on error

函数说明:

函数的作用是将当前进程的nice值加上参数incr作为新的nice值。如果incr的值太大,则系统会自动将结果调整为最大的有效值;如果incr的值太小,则系统会自动将结果调整为最小的有效值,即-1。因为-1是一个合法的返回值,所以判断nice函数是否成功调用需要同时判断函数返回值和errno。在调用nice函数之前将errno清0。如果返回值为-1,errno为0.则调用成功,如果返回值和errno都为-1,则调用失败。函数getpriority可以用来获取一个进程的nice值。

函数声明:

#include <sys/resource.h>

int getpriority(int which , id_t who);

// Returns: nice value between -NZERO和NZERO-1之间 if OK, -1 on error

参数说明:

which:有三个可取值:PRIO_PROCESS表明是一个进程,PRIO_PGRP表明是一个进程组,PRIO_USER表明目标是一个用户。

which参数的作用是控制who的含义,以及who参数如何选择进程。

如果who取值为0,则函数返回当前调用进程、进程组或用户的nice值。

如果which取值为PRIO_USER,who取值0,则返回当前进程的真实用户ID(real user Id)。

如果which取值为PRIO_GROUP,则返回所有进程中priority最高,即nice值最低的进程的nice值。

设置nice值使用函数setpriority。

函数声明:

#include <sys/resource.h>

int setpriority(int which, id_t who, int value);

参数的作用和getpriority相同。

value的值被加到nice默认值NZERO上,设置该值为新的nice值。

4 进程时间(Process Times)进程时间包括:墙上时间(wall clock tie),用户CPU时间(user CPU time),内核CPU时间(system CPU time).

函数times可以获取这三种时间。

函数声明:

#include <sys/times.h>

clock_t times(struct tms *buf);

函数细节:

函数会向结构体struct tms类型的变量中填充上面的三个时间,struct tms结构体的声明如下:

墙上时间为该函数的返回值。墙上时间为从过去某个时间点到现在的时间,所以不能直接作为时间来使用。

大多情况下,我们可以通过times的返回值来计算相对时间,例如,在进程开始和结束时分别调用times函数,然后相减来计算进程的运行时间。

两个子进程时间变量用来保存父进程调用wait函数等待子进程退出的时间。

Example程序功能:执行命令行传入的命令,计算每个命令执行的时间,并打印结构体tms中的成员值。

code

#include "apue.h"

#include <sys/times.h>

static void pr_times(clock_t, struct tms *, struct tms *);

staticvoid do_cmd(char *);

int

main(int argc, char *argv[])

{

int i;

setbuf(stdout, NULL);

for (i = 1; i < argc; i++)

do_cmd(argv[i]); /* once for each command-line arg */

exit(0);

}

staticvoid

do_cmd(char *cmd) /* execute and time the "cmd" */

{

struct tms tmsstart, tmsend;

clock_t start, end;

int status;

printf("\ncommand: %s\n", cmd);

if ((start = times(&tmsstart)) == -1) /* starting values */

err_sys("times error");

if ((status = system(cmd)) < 0) /* execute command */

err_sys("system() error");

if ((end = times(&tmsend)) == -1) /* ending values */

err_sys("times error");

pr_times(end-start, &tmsstart, &tmsend);

pr_exit(status);

}

staticvoid

pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend)

{

static long clktck = 0;

if (clktck == 0) /* fetch clock ticks per second first time */

if ((clktck = sysconf(_SC_CLK_TCK)) < 0)

err_sys("sysconf error");

printf(" real: %7.2f\n", real / (double) clktck);

printf(" user: %7.2f\n",

(tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);

printf(" sys: %7.2f\n",

(tmsend->tms_stime - tmsstart->tms_stime) / (double) clktck);

printf(" child user: %7.2f\n",

(tmsend->tms_cutime - tmsstart->tms_cutime) / (double) clktck);

printf(" child sys: %7.2f\n",

(tmsend->tms_cstime - tmsstart->tms_cstime) / (double) clktck);

}

运行结果:

小结进程控制章节介绍了以下内容:

forkexec_exitwait和waitpidsystem解释器文件(interpreter files)和他们的工作原理进程时间下一章我们将会学习到进程关系(process relationship),关键字:sessions,job control。

参考资料:

《Advanced Programming in the UNIX Envinronment 3rd》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有