进程环境与进程控制(5): 进程时间

来源:互联网 发布:java培训内容 编辑:程序博客网 时间:2024/06/10 21:15
#include <sys/times.h>
clock_t times(
struct tms *buf);

返回值: 若成功则返回流逝的墙上时钟时间, 若出错返回-1.
所有由此函数返回的clock_t值都用_SC_CLK_TCK变换成秒数.(由sysconf函数返回的每秒时钟滴答数)
此函数填写由buf指向的tms结构, 该结构定义如下:

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 */
}
;

注意: 此结构没有包含墙上时钟是的任何测量值. 作为替代, times函数返回墙上时钟时间作为函数值. 此值是相对于过去的某一时刻测试的, 所以不能用其绝对值, 而必须使用其相对值.
例如, 调用times, 保存其返回值. 在以后某个时间再次调用times, 从新的返回值中减去以前的返回值, 此差值就是墙上时钟时间.
该结构中的后两个成员是针对子进程的变量, 包含了用wait, waitpid等待到的各个子进程的值.

 

实例代码:

#include <sys/times.h>

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

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


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

    printf(
" command: %s ", cmd);

    
if ((start = times(&tmsstart)) == -1)
        
/* error handler */

    
if ((status == system(cmd)) < 0)
        
/* error handler */

    
if (end = times(&tmsend)) == -1_
        
/* error handler */

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

    
return status;
}


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)
            
/* error hanlder */
    printf(
" read: %7.2f ", read / (double)clktck);
    printf(
" user: %7.2f ", tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);
    ...
    ...
}

运行:

$ ./a.out "sleep 5" "date"

command: sleep 5
 real:      5.02
 user:      0.00
 sys:       0.00
 child user:      0.01
 child sys:       0.00

command: date
Fri Jun 22 17:11:20 EST 2007
 real:      0.01
 user:      0.00
 sys:       0.00
 child user:      0.01
 child sys:       0.00