45 독서 노트: 제8 장 프로 세 스 제어 (8)

8.15 사용자 표식
        이 프로그램 을 실행 하 는 사용자 로그 인 이름 을 가 져 올 때 getpwuid (getpid () 를 호출 할 수 있 습 니 다.그러나 한 사용자 가 여러 개의 로그 인 이름 을 가지 고 있다 면 이 로그 인 이름 들 은 같은 사용자 ID (한 사람 이 암호 파일 에 여러 개의 로그 인 항목 이 있 을 수 있 습 니 다. 사용자 ID 는 같 지만 로그 인 셸 은 다 릅 니 다.) 에 대응 하면 어떻게 될까요?시스템 은 보통 사용자 가 로그 인 할 때 사용 하 는 이름 을 기록 합 니 다. getlogin 함수 로 로그 인 이름 을 가 져 올 수 있 습 니 다.
       #include <unistd.h>

       char *getlogin(void);
        // 返回值:若成功则返回指向登陆名字符串的指针,若出错则返回NULL

        이 함 수 를 호출 하 는 프로 세 스 가 사용자 가 로그 인 할 때 사용 하 는 터미널 에 연결 되 지 않 으 면 이 함수 가 실 패 됩 니 다.보통 이 프로 세 스 를 데 몬 이 라 고 합 니 다.
        로그 인 이름 을 제시 하면 getpwnam 으로 암호 파일 에서 사용자 의 해당 기록 을 찾 아 로그 인 셸 등 을 확인 할 수 있 습 니 다.
8.16 프로 세 스 시간
        세 가지 시간: 벽 시계 시간, 사용자 CPU 시간 과 시스템 CPU 시간.모든 프로 세 스 는 times 함 수 를 호출 하여 자신 과 종 료 된 하위 프로 세 스 의 상기 값 을 얻 을 수 있 습 니 다.
       #include <sys/times.h>

       clock_t times(struct tms *buf);
        // 返回值:若成功则返回流逝的墙上时钟时间(单位:时钟滴答数),若出错则返回-1

        이 함 수 는 buf 가 가리 키 는 tms 구 조 를 추가 합 니 다. 이 구 조 는 다음 과 같이 정의 합 니 다.
           struct tms {
               clock_t tms_utime;  /* user time */
               clock_t tms_stime;  /* system time */
               clock_t tms_cutime; /* user time of children */
               clock_t tms_cstime; /* system time of children */
           };

        이 구 조 는 벽 시계 시간의 측정 치 를 포함 하지 않 습 니 다.대신 times 함 수 는 벽 에 있 는 시계 시간 을 함수 값 으로 되 돌려 줍 니 다.이 값 은 과거 어느 순간 에 비해 측정 되 었 기 때문에 절대 값 을 사용 할 수 없고 상대 값 을 사용 해 야 합 니 다.예 를 들 어 times 를 호출 하여 반환 값 을 저장 합 니 다.이후 어느 시간 에 times 를 다시 호출 하여 새로운 반환 값 에서 이전의 반환 값 을 빼 면 이 차 이 는 바로 벽 시계 시간 입 니 다.
        이 구조 에서 두 개의 하위 프로 세 스 필드 는 이 프로 세 스 가 wait, waitid 또는 waitpid 로 기다 리 고 있 는 각 하위 프로 세 스 의 값 을 포함 하고 있 습 니 다.
        이 함수 에서 돌아 오 는 모든 clockt 값 모두 사용SC_CLK_TCK (sysconf 함수 에서 되 돌아 오 는 초당 시계 똑 딱 이 수) 를 초 수로 변환 합 니 다.
        대부분의 구현 은 getrusage (2) 함 수 를 제공 합 니 다. 이 함 수 는 CPU 시간 을 되 돌려 주 고 자원 사용 상황 을 표시 하 는 다른 14 개의 값 을 제공 합 니 다.
        P210: 프로그램 목록 8 - 18 시간 및 모든 명령 행 인자 실행
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/wait.h>

static void do_cmd(char *cmd);
static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend);
void pr_exit(int status);

int main(int argc, char *argv[])
{
    int     i;  
    
    setbuf(stdout, NULL);
    for (i = 1; i < argc; i++)
        do_cmd(argv[i]);            // 为每一个arg调用一次
    exit(0);
}

static void do_cmd(char *cmd)       // 执行cmd,并为cmd计时
{
    struct tms  tmsstart, tmsend;
    clock_t     start, end;
    int         status;

    printf("
command: %s
", cmd);     if ((start = times(&tmsstart)) == -1)       // 开始时间         fprintf(stderr, "times error
");     if ((status = system(cmd)) < 0)         fprintf(stderr, "system() error
");    // 执行cmd     if ((end = times(&tmsend)) == -1)          fprintf(stderr, "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 (clktck == 0)         if (( clktck = sysconf(_SC_CLK_TCK)) < 0)   // 获得每秒时钟滴答数             fprintf(stderr, "sysconf error
");     printf("     readl: %7.2f
", real/ (double)clktck);     printf("      user: %7.2f
", (tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);     printf("       sys: %7.2f
", (tmsend->tms_stime - tmsstart->tms_stime) / (double) clktck);     printf("child user: %7.2f
", (tmsend->tms_cutime - tmsstart->tms_cutime) / (double) clktck);     printf("child sys : %7.2f
", (tmsend->tms_cstime - tmsstart->tms_cstime) / (double) clktck); } 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),                 WCOREDUMP(status) ? " (core file generated)" : "");     else if (WIFSTOPPED(status))         printf("child stopped, signal number = %d
", WSTOPSIG(status)); }

        이 프로그램 을 실행 하면 다음 을 얻 을 수 있 습 니 다:
$ ./18 "sleep 5" "date"

command: sleep 5
     readl:    5.00
      user:    0.00
       sys:    0.00
child user:    0.00
child sys :    0.00
normal termination exit status = 0

command: date
2014年 08月 04日 星期一 15:15:56 CST
     readl:    0.00
      user:    0.00
       sys:    0.00
child user:    0.00
child sys :    0.00
normal termination exit status = 0

        이 두 개의 인 스 턴 스 에서 하위 프로 세 스에 표 시 된 모든 CPU 시간 은 셸 과 명령 을 실행 하 는 하위 프로 세 스 가 사용 하 는 CPU 시간 입 니 다.

좋은 웹페이지 즐겨찾기