《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。
程序简介:这个例子将每个命令行参数作为shell命令执行,对每个命令计时,并打印出每次计时结束后从tms结构体中所取得的值。
//《APUE》程序8-18:执行所有的命令行参数以及计时 #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <sys/times.h> #include <unistd.h> void pr_exit(int status); void error_quit(const char *str); 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]); return 0; } //输出错误信息并退出 void error_quit(const char *str) { fprintf(stderr, "%s\n", str); exit(1); } void pr_exit(int status) { if( WIFEXITED(status) ) { printf("normal termination, exit status = %d\n", WEXITSTATUS(status)); } else if( WIFSIGNALED(status) ) { printf("abnormal termination, signal number = %d%s\n", WTERMSIG(status), #ifdef WCOREDUMP WCOREDUMP(status) ? " (core file gererated)" : " no "); #else ""); #endif } else if( WIFSTOPPED(status) ) { printf("child stopped, signal number = %d\n", WSTOPSIG(status)); } } //执行给定命令并计时 static void do_cmd(char *cmd) { struct tms tmsstart, tmsend; clock_t start, end; int status; printf("\ncommand: %s\n", cmd); //开始计时 start = times(&tmsstart); if( -1 == start ) error_quit("times error"); //执行命令 status = system(cmd); if( status < 0 ) error_quit("system() error"); //结束计时 end = times(&tmsend); if( -1 == end ) error_quit("times error"); pr_times(end-start, &tmsstart, &tmsend); pr_exit(status); } static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend) { static long clktck = 0; if( 0 == clktck ) { clktck = sysconf(_SC_CLK_TCK); if( clktck < 0 ) error_quit("sysconf error"); } double temp; temp = (double)real / clktck; printf(" real: %0.2f\n", temp); temp = (double)(tmsend->tms_utime - tmsstart->tms_utime) / clktck; printf(" user: %0.2f\n", temp); temp = (double)(tmsend->tms_stime - tmsstart->tms_stime) / clktck; printf(" sys: %0.2f\n", temp); temp = (double)(tmsend->tms_cutime - tmsstart->tms_cutime) / clktck; printf(" child user: %0.2f\n", temp); temp = (double)(tmsend->tms_cstime - tmsstart->tms_cstime) / clktck; printf(" child sys: %0.2f\n", temp); }
运行示例(红色字体的为输入):
qch@ubuntu:~/code$gcc temp.c -o temp
qch@ubuntu:~/code$ ./temp "sleep 5" "date"
command: sleep 5
real: 5.02
user: 0.00
sys: 0.00
child user: 0.00
child sys: 0.00
normal termination, exit status = 0
command: date
2012年 08月 22日 星期三 23:31:58 PDT
real: 0.02
user: 0.00
sys: 0.00
child user: 0.00
child sys: 0.02
normal termination, exit status = 0