45 독서 노트: 제8 장 프로 세 스 제어 (8)
4945 단어 독서 노트< UNIX 환경 고급 프로 그래 밍 >
이 프로그램 을 실행 하 는 사용자 로그 인 이름 을 가 져 올 때 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 시간 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로그'메타프로그램 루비 버전 2'3장 읽기동적 방법 Object#send 호출 방법은 약간 메모와 Object#send obj.send(:my_method, 3) Object#send를 사용하면 어떤 방법으로든 호출할 수 있습니다. privete 방법을 호...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.