[카테고리:] <span>리눅스 시스템 프로그래밍</span>

리눅스 시스템에서는 프로세스의 수행 시간을 clock_t 단위로 계산하는 times 함수를 제공합니다. times 함수는 struct tms 형식 변수의 주소를 입력 인자로 받아 수행 시간을 채워줍니다. struct tms 형식은 User 모드에서 수행한 시간과 Kernel 모드에서 수행한 시간, 종료한 자식들이 User 모드에서 수행한 시간과 Kernel 모드에서 수행한 시간을 기억하는 멤버로 구성합니다.

#include <sys/times.h>

clock_t times(struct tms *buf);

struct tms{

clock_t tms_utime; //user mode time, USER CPU time

clock_t tms_stime; //kernel mode time, SYSTEM CPU time

clock_t tms_cutime; //user mode time (terminated children)

clock_t tms_cstime; //kernel mode time (terminated children)

};

 
다음은 5개의 자식 프로세스를 생성하여 표준 출력에 문자를 반복 출력하는 구문을 작성하게 하여 CPU 시간을 측정하는 예제 코드입니다.

/**********************************************************************
* ex_times.c                                                          *
* exmple source – print usage time                                    *
**********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/times.h>

void MakeChild(int seq,int rval);
int main()
{
    srand((unsigned)time(0));

    int i = 0; 
    for(i=0; i<5; i++)
    {
        MakeChild(i+1, rand()%10);
    }

    int rval=0;
    pid_t cpid=0;
    while(i>0)
    {
        cpid = wait(&rval);
        printf("cpid:%d exit status:%#x\n",cpid, rval);
        i--;
    }


    for(i=0; i<10000000;i++)
    {
        putchar('-');
    }

    struct tms buf;
    times(&buf);

    printf("USER CPU time:%d \n", buf.tms_utime);
    printf("SYSTEM CPU time:%d \n", buf.tms_stime);
    printf("Children's USER CPU time:%d \n", buf.tms_cutime);
    printf("Children's SYSTEM CPU time:%d \n", buf.tms_cstime);
    return 0;
}
void MakeChild(int seq,int rval)
{
    pid_t cpid = fork();

    if(cpid == -1)
    {
        perror("error fork");
        return;
    }

    if(cpid>0)
    {
        printf("fork child pid:%u\n",cpid);
    }
    else
    {
        printf("pid:%d sleep %dseconds\n",getpid(), rval);

        int i = 0;
        for(i=0; i<10000000;i++)
        {
            putchar('.');
        }

        exit(seq);
    }
}
[그림 8.15] ex_times 실행 화면
[그림 8.15] ex_times 실행 화면

리눅스 시스템 프로그래밍