读书人

《APUE》:实施所有的命令行参数以及计

发布时间: 2012-08-31 12:55:03 作者: rapoo

《APUE》:执行所有的命令行参数以及计时

《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。


//《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 WCOREDUMPWCOREDUMP(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

读书人网 >编程

热点推荐