进程时间

任一进程都可使用 times 函数来获得它自己以及终止子进程的 3 个时间:墙上时钟时间、用户 CPU 时间和系统 CPU 时间。

#include <sys/times.h>
clock_t times(struct tms *buf);
/* 返回值:若成功,返回流逝的墙上时钟时间(以时钟滴答数为单位);否则,返回 -1 */

struct tms{
clock_t tms_utime; // user CPU time
clock_t tms_stime; // system CPU time
clock_t tms_cutime; // user CPU time, terminated children
clock_t tms_cstime; // system CPU time, terminated children
};

注意,墙上时钟时间是作为返回值得到的,它是相对于过去某一时刻度量的。tms 结构中两个针对子进程的字段包含了此进程用 wait 函数族已等待到的各子进程的值。所有由此函数返回的 clock_t 值都用 _SC_CLK_TCK(由 sysconf 函数返回的每秒时钟滴答数)转换成秒数(多数实现还提供了 getrusage 函数,该函数返回由 CPU 时间以及指示资源使用情况的另外 14 个值)。
下列程序会对每个 shell 命令计时,并打印从 tms 结构取得的值。

#include <stdlib.h>
#include <stdio.h>
#include <sys/times.h>

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

int main(int argc, char *argv[]){
int i;

setbuf(stdout, NULL);
for(i=1; i<argc; i++)
do_cmd(argv[i]);
exit(0);
}

static void do_cmd(char *cmd){
struct tms tmsstart, tmsend;
clock_t start, end;
int status;

printf("\ncommand: %s\n", cmd);
if((start=times(&tmsstart)) == -1)
printf("times 1 error\n");
if((status=system(cmd)) < 0)
printf("system error\n");
if((end=times(&tmsend)) == -1)
printf("times 2 error\n");

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

static void
pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend){
static long clktck = 0;

if(clktck == 0)
if((clktck=sysconf(_SC_CLK_TCK)) < 0)
printf("sysconf error\n");
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);
}

运行结果:

$ ./timesDemo.out "sleep 5" "date>/dev/null" "man bash>/dev/null"

command: sleep 5
real: 5.01
user: 0.00
sys: 0.00
child user: 0.00
child sys: 0.00

command: date>/dev/null
real: 0.00
user: 0.00
sys: 0.00
child user: 0.00
child sys: 0.00

command: man bash>/dev/null
real: 0.28
user: 0.00
sys: 0.00
child user: 0.23
child sys: 0.02

前两个命令的执行时间足够快避免了以可报告的精度记录 CPU 时间,但第三个命令运行了一个处理时间足够长的程序来表面所有的 CPU 时间都出现在子进程中,而 shell 和命令正是在子进程中执行的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值