《 유 닉 스 환경 고급 프로 그래 밍 》: 모든 명령 행 인자 와 시간 을 실행 합 니 다.

'유 닉 스 환경 고급 프로 그래 밍' 이라는 책 에는 짧 고 아름 다운 애플 릿 이 많이 첨부 되 어 있 습 니 다. 저 는 이 책 을 읽 을 때 책 에 있 는 코드 를 자신의 이해 에 따라 다시 한 번 썼 습 니 다.이 예 는 우 분투 10.04 에서 테스트 에 통과 했다.
프로그램 소개: 이 예 는 모든 명령 행 인 자 를 셸 명령 으로 실행 하고 모든 명령 에 시간 을 재 며 시간 이 끝 날 때마다 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
", str); exit(1); } void pr_exit(int status) { if( WIFEXITED(status) ) { printf("normal termination, exit status = %d
", WEXITSTATUS(status)); } else if( WIFSIGNALED(status) ) { printf("abnormal termination, signal number = %d%s
", WTERMSIG(status), #ifdef WCOREDUMP WCOREDUMP(status) ? " (core file gererated)" : " no "); #else ""); #endif } else if( WIFSTOPPED(status) ) { printf("child stopped, signal number = %d
", WSTOPSIG(status)); } } // static void do_cmd(char *cmd) { struct tms tmsstart, tmsend; clock_t start, end; int status; printf("
command: %s
", 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
", temp); temp = (double)(tmsend->tms_utime - tmsstart->tms_utime) / clktck; printf(" user: %0.2f
", temp); temp = (double)(tmsend->tms_stime - tmsstart->tms_stime) / clktck; printf(" sys: %0.2f
", temp); temp = (double)(tmsend->tms_cutime - tmsstart->tms_cutime) / clktck; printf(" child user: %0.2f
", temp); temp = (double)(tmsend->tms_cstime - tmsstart->tms_cstime) / clktck; printf(" child sys: %0.2f
", 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 명령: 날짜 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

좋은 웹페이지 즐겨찾기