1 / 60

시스템 정보

4. 시스템 정보. 학습 목표. 유닉스 시스템 정보를 검색하는 함수를 사용할 수 있다 . 사용자 관련 정보를 함수를 이용해 검색할 수 있다 . 시스템의 시간을 관리하는 함수를 사용할 수 있다. 강의 목차. 시간 관리 함수 초 단위 시간 검색 시간대 설정 시간 정보 분해 함수 초 단위 시간 생성 함수 형식 지정 시간 출력 함수. 유닉스 시스템 관련 정보 운영체제 기본정보 검색 시스템 정보 검색과 설정 시스템 자원 정보 검색 사용자 정보 검색 로그인명 검색 패스워드 파일 검색 섀도우 파일 검색

devlin
Download Presentation

시스템 정보

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4 시스템 정보

  2. 학습 목표 • 유닉스 시스템 정보를 검색하는 함수를 사용할 수 있다. • 사용자 관련 정보를 함수를 이용해 검색할 수 있다. • 시스템의 시간을 관리하는 함수를 사용할 수 있다.

  3. 강의 목차 • 시간 관리 함수 • 초 단위 시간 검색 • 시간대 설정 • 시간 정보 분해 함수 • 초 단위 시간 생성 함수 • 형식 지정 시간 출력 함수 • 유닉스 시스템 관련 정보 • 운영체제 기본정보 검색 • 시스템 정보 검색과 설정 • 시스템 자원 정보 검색 • 사용자 정보 검색 • 로그인명 검색 • 패스워드 파일 검색 • 섀도우 파일 검색 • 그룹 파일 검색 • 로그인 기록 정보 검색

  4. 시스템에 설치된 운영체제에 관한 정보 호스트 이름 정보 하드웨어 종류에 관한 정보 하드웨어에 따라 사용할 수 있는 자원의 최댓값 최대 프로세스 개수 프로세스당 열 수 있는 최대 파일 개수 메모리 페이지 크기 등 시스템 정보에 대한 접근 시스템 정보에 대한 다양한 구조체와 매개변수, 상수 제공 적절한 시스템 호출과 구조체를 사용하여 시스템 정보를 검색하거나 설정 가능 유닉스 시스템 관련정보

  5. 시스템에 설치된 운영체제에 대한 기본 정보 검색 시스템은 인텔PC고 솔라리스 10운영체제가 설치되어 있고, 호스트명은 hanbit 운영체제 정보 검색 함수 : uname(2) utsname 구조체에 운영체제 정보 저장 sysname : 현재 운영체제 이름 nodename : 호스트명 release : 운영체제의 릴리즈 번호 version : 운영체제 버전 번호 machine : 하드웨어 아키텍처 이름 운영체제 기본 정보 검색 #include <sys/utsname.h> int uname(struct utsname *name); structutsname { char sysname[_SYS_NMLN]; char nodename[_SYS_NMLN]; char release[_SYS_NMLN]; char version[_SYS_NMLN]; char machine[_SYS_NMLN]; };

  6. [예제 4-1] uname 함수사용하기 ex4_1.c 01 #include <sys/utsname.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 structutsnameuts; 07 08 if (uname(&uts) == -1) { 09 perror("uname"); 10 exit(1); 11 } 12 13 printf("OSname : %s\n", uts.sysname); 14 printf("Nodename : %s\n", uts.nodename); 15 printf("Release : %s\n", uts.release); 16 printf("Version : %s\n", uts.version); 17 printf("Machine : %s\n", uts.machine); 18 19 return 0; 20 } # ex4_1.out OSname : SunOS Nodename : hanbit Release : 5.10 Version : Generic_118855-33 Machine : i86pc

  7. 시스템 정보 검색과 설정: sysinfo(2) command에 검색하거나 설정할 명령 지정 command에 사용할 상수의 범주 시스템 정보 검색과 설정 (1) #include <sys/systeminfo.h> long sysinfo(int command, char *buf, long count); SVR4에서 제안, 다른 유닉스운영체제에서는 지원하지 않을 수 있음

  8. 유닉스 표준에서 정의한 정보 검색용 상수 시스템 정보 검색과 설정 (2)

  9. 유닉스 표준에서 정의한 정보 설정용 상수 솔라리스에서 정의한 정보 검색용 상수 시스템 정보 검색과 설정 (3)

  10. [예제 4-2] sysinfo 함수 사용하기(검색) ex4_2.c 01 #include <sys/systeminfo.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 char buf[257]; 07 08 if (sysinfo(SI_HW_SERIAL, buf, 257) == -1) { 09 perror("sysinfo"); 10 exit(1); 11 } 12 printf("HW Serial : %s\n", buf); 13 14 if (sysinfo(SI_ISALIST, buf, 257) == -1) { 15 perror("sysinfo"); 16 exit(1); 17 } 18 printf("ISA List : %s\n", buf); 19 20 return 0; 21 } 하드웨어 일련번호 검색 사용가능한 아키텍처 목록검색 # ex4_2.out HW Serial : 545486663 ISA List : amd64 pentium_pro+mmxpentium_propentium+mmxpentium i486 i386 i86

  11. [예제 4-3] sysinfo 함수 사용하기(설정) ex4_3.c 01 #include <sys/systeminfo.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 #include <string.h> 05 06 int main(void) { 07 char buf[257]; 08 09 if (sysinfo(SI_HOSTNAME, buf, 257) == -1) { 10 perror("sysinfo"); 11 exit(1); 12 } 13 printf("Before Hostname : %s\n", buf); 14 15 strcpy(buf, "hbooks"); 16 if (sysinfo(SI_SET_HOSTNAME, buf, 257) == -1) { 17 perror("sysinfo"); 18 exit(1); 19 } 20 21 if (sysinfo(SI_HOSTNAME, buf, 257) == -1) { 22 perror("sysinfo"); 23 exit(1); 호스트 이름 변경

  12. [예제 4-3] sysinfo 함수 사용하기(설정) 24 } 25 printf("After Hostname : %s\n", buf); 26 27 return 0; 28 } # ex4_3.out Before Hostname : hanbit After Hostname : hbooks

  13. sysinfo(2) in Linux 시스템 통계값에 대한 정보 검색 sysinfo 구조체 시스템 정보 검색과 설정 (4) : Linux #include <sys/sysinfo.h> int sysinfo(struct sysinfo *info); struct sysinfo { long uptime; /* Seconds since boot */ unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ unsigned long totalram; /* Total usable main memory size */ unsigned long freeram; /* Available memory size */ unsigned long sharedram; /* Amount of shared memory */ unsigned long bufferram; /* Memory used by buffers */ unsigned long totalswap; /* Total swap space size */ unsigned long freeswap; /* swap space still available */ unsigned short procs; /* Number of current processes */ unsigned long totalhigh; /* Total high memory size */ unsigned long freehigh; /* Available high memory size */ unsigned int mem_unit; /* Memory unit size in bytes */ char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ };

  14. 호스트 이름 검색 및 설정 gethostname : 현재 시스템에 설정된 호스트 명을 검색 sethostname : 시스템에 호스트 명을 새로이 설정 Linux를 포함한 BSD 계열 유닉스 운영체제에서 사용 시스템 정보 검색과 설정 (5) : Linux #include <unistd.h> int gethostname(char *name, int namelen); int sethostname(cont char *name, int namelen);

  15. 하드웨어에 따라 사용할 수 있는 자원들의 최댓값 검색 시스템 자원 정보 검색 : sysinfo(3) 검색할 정보를 나타내는 상수를 사용해야 한다. POSIX.1에서 정의한 상수 시스템 자원 정보 검색 (1) #include <unistd.h> long sysconf(int name);

  16. SVR4에서 정의한 상수 POSIX.4에서 정의한 상수 XPG.4에서 정의한 상수 시스템 자원 정보 검색 (2)

  17. [예제 4-4] sysconf 함수 사용하기 ex4_4.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 printf("Clock Tick : %ld\n", sysconf(_SC_CLK_TCK)); 06 printf("Max Open File : %ld\n", sysconf(_SC_OPEN_MAX)); 07 printf("Max Login Name Length : %ld\n", sysconf(_SC_LOGNAME_MAX)); 08 09 return 0; 10 } # ex4_4.out Clock Tick : 100 Max Open File : 256 Max Login Name Length : 8

  18. 파일과 디렉토리 관련 자원 검색 : fpathconf(3), pathconf(3) 경로(path)나 파일기술자에 지정된 파일에 설정된 자원값이나 옵션값 반환 name 사용할 상수 시스템 자원 정보 검색 (3) #include <unistd.h> long pathconf(const char *path, int name); long fpathconf(int fildes, int name);

  19. [예제 4-5] pathconf 함수 사용하기 ex4_5.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 printf("Link Max : %ld\n", pathconf(".", _PC_LINK_MAX)); 06 printf("Name Max : %ld\n", pathconf(".", _PC_NAME_MAX)); 07 printf("Path Max : %ld\n", pathconf(".", _PC_PATH_MAX)); 08 09 return 0; 10 } # ex4_5.out Link Max : 32767 Name Max : 255 Path Max : 1024

  20. 사용자 정보, 그룹정보, 로그인 기록 검색 /etc/passwd, /etc/shadow, /etc/group, /var/run/utmp 사용자 식별 정보 : 로그인명 / UID(User ID) 로그인명 사용자 식별 문자열 주로 시스템 외부에서 사용자를 식별할 때 사용 사용자와 관련된 시스템 자원 정보를 보여줄 때에 사용 UID 사용자 식별 번호(정수) 주로 시스템 내부에서 사용자를 식별할 때 사용 시스템 자원의 소유자를 식별할 때 사용 /etc/passwd 시스템 파일 사용자의 주요 정보를 저장 로그인명과 UID를 mapping 패스워드 암호화 여부 및 홈디렉토리, 로그인 쉘 정보 등을 저장 /etc/shadow 패스워크의 암호화 파일 사용자 정보 검색 (1)

  21. 로그인명 검색 : getlogin(3), cuserid(3) /var/run/utmp(or/var/adm/utmpx) 파일을 검색하여 현재 프로세스를 실행한 사용자의 로그인명을 반환 현재 프로세스의 소유자 정보로 로그인명을 찾아 반환 매개변수 s : 반환받을 로그인명을 저장할 버퍼 주소 s = NULL : 시스템 메모리에 로그인명을 저장하고 그 주소를 반환 사용자 정보 검색 (2) #include <unistd.h> char *getlogin(void); #include <stdio.h> char *cuserid(char *s);

  22. UID 검색 getuid : 실제 사용자 ID를반환 실제 사용자 ID (uid) : 로그인할 때 사용한 로그인명에 대응하는 UID, 현재 프로세스를 생성한 사용자를 식별 geteuid : 유효 사용자 ID를 반환 유효 사용자 ID(euid) : 프로세스에 대한 접근 권한을 부여할 때에 사용 로그인 시에는 uid와 euid는 동일하나, setuid 권한이 설정된 프로그램을 실행하거나 다른 사용자 ID로 변경하는 경우에 euid는 변경된다. 사용자 정보 검색 (3) #include <sys/types.h> #include <unistd.h> uid_t getuid(void); uid_t geteuid(void);

  23. [예제 4-6] getuid, geteuid 함수사용하기 ex4_6.c 01 #include <sys/types.h> 02 #include <unistd.h> 03 #include <stdio.h> 04 05 int main(void) { 06 uid_tuid, euid; 07 char *name, *cname; 08 09 uid = getuid(); 10 euid = geteuid(); 11 12 name = getlogin(); 13 cname = cuserid(NULL); 14 15 printf("Login Name=%s,%s UID=%d, EUID=%d\n", name, cname, (int)uid, (int)euid); 16 17 return 0; 18 } # ex4_6.out Login Name=root,root UID=0, EUID=0 # chmod 4755 ex4_6.out # ls -l ex4_6.out -rwsr-xr-x 1 root other 5964 1월 29일 15:11 ex4_6.out setuid 설정 후 일반사용자가 이 파일을 실행하면?

  24. /etc/passwd 파일의 구조 /etc/passwd 파일 검색 (1) # cat /etc/passwd root:x:0:0:Super-User:/:/usr/bin/ksh daemon:x:1:1::/: bin:x:2:2::/usr/bin: ...... hbooks:x:100:1:Hanbit Books:/export/home/han:/bin/ksh

  25. UID로 passwd 파일 읽기 : getpwuid(3) 이름으로 passwd 파일 읽기 : getpwnam(3) passwd 구조체 /etc/passwd 파일 검색 (2) #include <pwd.h> struct passwd *getpwuid(uid_t uid); #include <pwd.h> struct passwd *getpwnam(const char *name); • structpasswd { • char *pw_name; • char *pw_passwd; • uid_tpw_uid; • gid_tpw_gid; • char *pw_age; • char *pw_comment; • char *pw_gecos; • char *pw_dir; • char *pw_shell; • };

  26. [예제 4-7] getpwuid 함수 사용하기 ex4_7.c 01 #include <unistd.h> 02 #include <pwd.h> 03 04 int main(void) { 05 structpasswd *pw; 06 07 pw = getpwuid(getuid()); 08 printf("UID : %d\n", (int)pw->pw_uid); 09 printf("Login Name : %s\n", pw->pw_name); 10 11 return 0; 12 } # ex4_7.out UID : 0 Login Name : root

  27. [예제 4-8] getpwnam 함수 사용하기 ex4_8.c 01 #include <pwd.h> 02 03 int main(void) { 04 structpasswd *pw; 05 06 pw = getpwnam("hbooks"); 07 printf("UID : %d\n", (int)pw->pw_uid); 08 printf("Home Directory : %s\n", pw->pw_dir); 09 10 return 0; 11 } # ex4_8.out UID : 100 Home Directory : /export/home/han

  28. /etc/passwd 파일 순차적으로 읽기 [예제 4-9] getpwent함수 사용하기 /etc/passwd 파일 검색 (3) #include <pwd.h> struct passwd *getpwent(void); // 사용자 정보를 순차적으로 읽어옴 void setpwent(void); // 파일 오프셋을 파일 처음으로 이동 void endpwent(void); // 파일 오프셋을 파일 마지막으로 이동 struct passwd *fgetpwent(FILE *fp); 01 #include <pwd.h> 02 03 int main(void) { 04 structpasswd *pw; 05 int n; 07 for (n = 0; n < 3; n++) { 08 pw = getpwent(); 09 printf("UID: %d, LoginName: %s\n", (int)pw->pw_uid, pw->pw_name); 10 } 11 12 return 0; 13 } ex4_9.c # ex4_9.out UID: 0, LoginName: root UID: 1, LoginName: daemon UID: 2, LoginName: bin

  29. /etc/shadow 파일의 구조 섀도우 파일 검색 (1) # cat /etc/shadow root:lyTy6ZkWh4RYw:13892:::::: daemon:NP:6445:::::: bin:NP:6445:::::: ...... hbooks:KzV35jsiil./6:14273:3:30:7:10:14344:

  30. /etc/shadow 파일 읽기 : getspnam(3) spwd 구조체 섀도우 파일 검색 (2) #include <shadow.h> struct spwd *getspnam(const char *name); struct spwd { char *sp_namp; // 로그인명 char *sp_pwdp; // 암호화된 패스워드 int sp_lstchg; // 패스워드를 변경한 날짜 정보 int sp_min; // 변경된 패스워드의 최소 사용 일 수 int sp_max; // 변경된 패스워드의 최대 사용 일 수 int sp_warn; // 패스워드 변경 경고 시작 일 수 int sp_inact; // 사용자 계정으로 로그인할 수 없는 일 수 int sp_expire; // 사용자 계정 만료 날짜 정보 unsigned int sp_flag; };

  31. [예제 4-10] getspnam 함수 사용하기 ex4_10.c 01 #include <shadow.h> 02 03 int main(void) { 04 structspwd *spw; 05 06 spw = getspnam("hbooks"); 07 printf("Login Name : %s\n", spw->sp_namp); 08 printf("Passwd : %s\n", spw->sp_pwdp); 09 printf("Last Change : %d\n", spw->sp_lstchg); 10 11 return 0; 12 } # ex4_10.out Login Name : hbooks Passwd : KzV35jsiil./6 Last Change : 14273

  32. /etc/shadow 파일 순차적으로 읽기 [예제 4-11] getspent함수 사용하기 섀도우 파일 검색 (3) #include <shadow.h> struct spwd *getspent(void); // 패스워드 정보를 순차 읽기 void setspent(void); // 파일 오프셋을 파일 처음으로 이동 void endspent(void); // 파일 오프셋을 파일 마지막으로 이동 struct spwd *fgetspent(FILE *fp); 01 #include <shadow.h> 02 03 int main(void) { 04 structspwd *spw; 05 int n; 06 07 for (n = 0; n < 3; n++) { 08 spw = getspent(); 09 printf("LoginName: %s, Passwd: %s\n", spw->sp_namp, spw->sp_pwdp); 10 } 11 12 return 0; 13 } ex4_11.c # ex4_11.out LoginName: root, Passwd: lyTy6ZkWh4RYw LoginName: daemon, Passwd: NP LoginName: bin, Passwd: NP

  33. 사용자 그룹 정보 유닉스 시스템에서는 사용자는 하나 이상의 그룹(group)에 속한다 그룹 식별 그룹명(groupname) : 그룹 식별 문자열 그룹 ID(group ID:GID) : 그룹 식별 번호(정수) 사용자는 소속 그룹에 따라 시스템 자원 및 파일 등에 대한 다른 접근 권한을 가진다. /etc/group 그룹 식별 정보를 저장하고 있는 파일 그룹명, GID, 그룹 소속 로그인명 등의 정보를 저장 그룹 정보 검색 (1)

  34. 그룹 ID 검색하기 : getgid(2), getegid(2) [예제 4-12] getid, getegid함수사용하기 그룹 정보 검색 (2) #include <sys/types.h> #include <unistd.h> gid_t getgid(void); // 현재 프로세스의 실제 그룹 ID gid_t getegid(void); // 현재 프로세스의 유효 그룹 ID 01 #include <sys/types.h> 02 #include <unistd.h> 03 #include <stdio.h> 04 05 int main(void) { 06 gid_tgid, egid; 07 08 gid = getgid(); 09 egid = getegid(); 10 11 printf("GID=%d, EGID=%d\n", (int)gid, (int)egid); 12 13 return 0; 14 } ex4_12.c # ex4_12.out GID=1, EGID=1

  35. /etc/group 파일의 구조 group 구조체 그룹 파일 검색 (1) # cat /etc/group root::0: other::1:root bin::2:root,daemon sys::3:root,bin,adm adm::4:root,daemon uucp::5:root ...... struct group { char *gr_name; // 그룹명 char *gr_passwd; // 그룹 패스워드 gid_t gr_gid; // GID char **gr_mem; // 그룹 멤버 로그인명 목록 };

  36. /etc/group 파일검색 : getgrnam(3), getgrgid(3) /etc/group 파일 순차적으로 읽기 그룹 파일 검색 (2) #include <grp.h> struct group *getgrnam(const char *name); struct group *getgrgid(gid_t gid); #include <grp.h> struct group *getgrent(void); void setgrent(void); void endgrent(void); struct group *fgetgrent(FILE *fp);

  37. [예제 4-13] getgrnam 함수 사용하기 ex4_13.c 01 #include <grp.h> 02 03 int main(void) { 04 struct group *grp; 05 int n; 06 07 grp = getgrnam("adm"); 08 printf("Group Name : %s\n", grp->gr_name); 09 printf("GID : %d\n", (int)grp->gr_gid); 10 11 n = 0; 12 printf("Members : "); 13 while (grp->gr_mem[n] != NULL) 14 printf("%s ", grp->gr_mem[n++]); 15 printf("\n"); 16 17 return 0; 18 } # ex4_13.out Group Name : adm GID : 4 Members : root daemon

  38. [예제 4-14] getgrent 함수사용하기 ex4_14.c 01 #include <grp.h> 02 03 int main(void) { 04 struct group *grp; 05 intn,m; 06 07 for (n = 0; n < 3; n++) { 08 grp = getgrent(); 09 printf("GroupName: %s, GID: %d ", grp->gr_name, (int)grp->gr_gid); 10 11 m = 0; 12 printf("Members : "); 13 while (grp->gr_mem[m] != NULL) 14 printf("%s ", grp->gr_mem[m++]); 15 printf("\n"); 16 } 17 18 return 0; 19 } # ex4_14.out GroupName: root, GID: 0 Members : GroupName: other, GID: 1 Members : root GroupName: bin, GID: 2 Members : root daemon

  39. who 명령 : 현재 시스템에 로그인하고 있는 사용자 정보 last 명령 : 시스템의 부팅 시간 정보와 사용자 로그인 기록 정보 /var/run/utmp : 현재 로그인된 사용자 정보를 저장 /var/adm/utmpx – SVR4(솔라리스) 계열 유닉스에서 지원 utmp 구조체 정보 단위로 저장 및 검색 /var/log/wtmp : 이전에 로그인된 사용자 정보를 저장 이전에 로그인 사용자를 추적 가능 로그인 기록 검색 (1)

  40. utmp 구조체 (inLinux) 로그인 기록 검색 (2) /* * utmp record types */ #define EMPTY 0 /* Record does not contain valid info */ #define RUN_LVL 1 /* Change in system run-level */ #define BOOT_TIME 2 /* Time of system boot (in ut_tv) */ #define NEW_TIME 3 /* Time after system clock change (in ut_tv) */ #define OLD_TIME 4 /* Time before system clock change (in ut_tv) */ #define INIT_PROCESS 5 /* Process spawned by init(8) */ #define LOGIN_PROCESS 6 /* Session leader process for user login */ #define USER_PROCESS 7 /* Normal process */ #define DEAD_PROCESS 8 /* Terminated process */ #define ACCOUNTING 9 /* Not implemented */ #define UT_LINESIZE 32 #define UT_NAMESIZE 32 #define UT_HOSTSIZE 256 struct exit_status { /* Type for ut_exit, below */ short int e_termination; /* Process termination status */ short int e_exit; /* Process exit status */ };

  41. utmp 구조체 (in Linux) 로그인 기록 검색 (3) struct utmp { short ut_type; /* Type of record */ pid_t ut_pid; /* PID of login process */ char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */ char ut_id[4]; /* Terminal name suffix, or inittab(5) ID */ char ut_user[UT_NAMESIZE]; /* Username */ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or kernel version for run-level messages */ struct exit_status ut_exit; /* Exit status of a process marked as DEAD_PROCESS; not used by Linux init(8) */ /* The ut_session and ut_tv fields must be the same size when compiled 32- and 64-bit. This allows data files and shared memory to be shared between 32- and 64-bit applications. */ #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32 int32_t ut_session; /* Session ID (getsid(2)), used for windowing */ struct { int32_t tv_sec; /* Seconds */ int32_t tv_usec; /* Microseconds */ } ut_tv; /* Time entry was made */ #else long ut_session; /* Session ID */ struct timeval ut_tv; /* Time entry was made */ #endif int32_t ut_addr_v6[4]; /* Internet address of remotehost; IPv4 address uses just ut_addr_v6[0] */ char __unused[20]; /* Reserved for future use */ };

  42. ut_type : 현재 읽어온 항목의 종류 EMPTY(0) : 비어 있는 항목 RUN_LVL(1) : 시스템의 런레벨이 변경되었음을 나타냄. 바뀐 런레벨은 ut_id에 저장 BOOT_TIME(2) : 시스템 부팅 정보를 나타냄. 부팅 시간은 ut_time에 저장 OLD_TIME(3) : date 명령으로 시스템 시간이 변경되었음을 나타냄. 변경되기 전의 시간을 저장 NEW_TIME(4) : date 명령으로 시스템 시간이 변경되었음을 나타내고변경된 시간을 저장 INIT_PROCESS(5) : init에 의해 생성된 프로세스임을 나타냄. 프로세스명은 ut_name에 저장하고 프로세스 ID는 ut_pid에 저장한다. LOGIN_PROCESS(6) : 사용자가 로그인하기를 기다리는 getty 프로세스를 나타낸다 USER_PROCESS(7) : 사용자 프로세스를 나타낸다. DEAD_PROCESS(8) : 종료한 프로세스를 나타낸다. ACCOUNTING(9) : 로그인 정보를 기록한 것임을 나타낸다. DOWN_TIME(10) : 시스템을 다운시킨 시간을 나타낸다. ut_type이 가질 수 있는 가장 큰 값이다. 로그인 기록 검색 (4)

  43. /var/adm/utmpx 파일 순차적으로 읽기 [예제 4-15] getutxent함수 사용하기 로그인 기록 검색 (5) #include <utmpx.h> struct utmpx *getutxent(void); // utmp 구조체 정보를 순차적으로 읽기 void setutxent(void); // 파일 오프셋을 파일 처음으로 이동 void endutxent(void); // 파일 오프셋을 파일 마지막으로 이동 int utmpxname(const char *file); ... 05 int main(void) { 06 structutmpx *utx; 07 08 printf("LoginName Line\n"); 09 printf("---------------\n"); 10 11 while ((utx=getutxent()) != NULL) { 12 if (utx->ut_type != USER_PROCESS) 13 continue; 14 15 printf("%s %s\n", utx->ut_user, utx->ut_line); 16 } 17 18 return 0; 19 } ex4_15.c # ex4_15.out LoginName Line --------------- root console root pts/3 root pts/5 root pts/4

  44. /var/run/utmp 파일 순차적으로 읽기 (in Linux) utmpname : utmp-format file 이름을 새롭게 설정 setutent / endutent : 파일 오프셋 이동 getutent : utmp-format file로 부터 utmp 구조체 정보를 순차적으로 읽기 getutid / getutline : 지정된 ut_type가 매칭되는 구조체 정보를 읽기 pututline : 새로운 utmp 구조체 정보를 utmp-format file에 저장 로그인 기록 검색 (6) #include <utmp.h> struct utmp *getutent(void); struct utmp *getutid(struct utmp *ut); struct utmp *getutline(struct utmp *ut); struct utmp *pututline(struct utmp *ut); void setutent(void); void endutent(void); int utmpname(const char *file);

  45. 유닉스 시스템에서 시간관리 1970년 1월 1일 0시 0분 0초(UTC)를 기준으로 현재까지 경과한 시간을 초 단위로 저장하고 이를 기준으로 시간 정보 관리 초 단위로 현재 시간 정보 얻기 : time(2) [예제 4-16] time 함수 사용하기 시간 관리 함수 (1) #include <sys/types.h> #include <time.h> time_t time(time_t *tloc); 01 #include <sys/types.h> 02 #include <time.h> 03 #include <stdio.h> 04 05 int main(void) { 06 time_ttt; 07 08 time(&tt); 09 printf("Time(sec) : %d\n", (int)tt); 10 11 return 0; 12 } ex4_16.c # ex4_16.out Time(sec) : 1233361205

  46. 마이크로 초 단위로 시간 정보얻기 : gettimeofday(3) timeval 구조체 [예제 4-17] gettimeofday함수 사용하기 시간 관리 함수 (2) #include <sys/time.h> int gettimeofday(struct timeval *tp, void *tzp); int settimeofday(struct timeval *tp, void *tzp); BSD 유닉스 계열에서 지원 struct timeval { time_t tv_sec; /* 초 */ suseconds_t tv_usec; /* 마이크로 초 */ }; .. 04 int main(void) { 05 structtimevaltv; 06 07 gettimeofday(&tv, NULL); 08 printf("Time(sec) : %d\n", (int)tv.tv_sec); 09 printf("Time(micro-sec) : %d\n", (int)tv.tv_usec); 10 11 return 0; 12 } ex4_17.c # ex4_17.out Time(sec) : 1233362365 Time(micro-sec) : 670913

  47. 시간대 정보 : tzset(3) 현재 지역의 시간대로 시간을 설정 전역변수 4개에 정보를 설정 timezone : UTC와 지역 시간대와 시차를 초 단위로 저장 altzone : UTC와 일광절약제 등으로 보정된 지역시간대와의 시차를 초 단위로 저장 daylight : 일광절약제를 시행하면 0이 아니고, 아니면 0 tzname : 지역시간대와 보정된 시간대명을 약어로 저장 [예제 4-18] tzset함수 사용하기 시간 관리 함수 (3) #include <time.h> void tzset(void); 01 #include <time.h> 02 #include <stdio.h> 03 04 int main(void) { 05 tzset(); 06 07 printf("Timezone : %d\n", (int)timezone); 08 printf("Altzone : %d\n", (int)altzone); 09 printf("Daylight : %d\n", daylight); 10 printf("TZname[0] : %s\n", tzname[0]); 11 printf("TZname[1] : %s\n", tzname[1]); 12 13 return 0; 14 } ex4_18.c # ex4_18.out Timezone : -32400 Altzone : -36000 Daylight : 1 TZname[0] : KST TZname[1] : KDT UTC와 9시간(32,400초) 시차가 발생

  48. tm 구조체 초단위 시스템 시간을 사용자가 인식하기 쉬운 형태로 변환하여 저장할 수 있는 구조체 시간 정보를 시분초 및 년월일 정보 등으로 표현 시간의 형태 변환 (1) struct tm { int tm_sec; // 초(0~60) int tm_min; // 분(0~50) int tm_hour; // 시(0~23) int tm_mday; // 일(1~31) int tm_mon; // 월(0~11) int tm_year; // 년도: (현재 년도 – 1900) int tm_wday; // 요일(0~6) int tm_yday; // 일 수(0~365) int tm_isdst; // 일과제 시행 여부 };

  49. 초 단위 시간 정보 분해 : gmtime(3), localtime(3) 초단위 시간을 인자로 받아 tm 구조체 반환 gmtime은 UTC기준, localtime은 지역시간대 기준으로 환산 초 단위 시간으로 역산 : mktime(3) tm 구조체로 주어진 시간 정보를 초단위 시간 정보로 역산 시간의 형태 변환 (2) #include <time.h> struct tm *localtime(const time_t *clock); struct tm *gmtime(const time_t *clock); #include <time.h> time_t mktime(struct tm *timeptr);

  50. [예제 4-19] gmtime, localtime 함수 사용하기 01 #include <time.h> 02 #include <stdio.h> 03 04 int main(void) { 05 struct tm *tm; 06 time_t t; 07 08 time(&t); 09 printf("Time(sec) : %d\n", (int)t); 10 11 tm = gmtime(&t); 12 printf("GMTIME=Y:%d ", tm->tm_year); 13 printf("M:%d ", tm->tm_mon); printf("D:%d ", tm->tm_mday); 15 printf("H:%d ", tm->tm_hour); 16 printf("M:%d ", tm->tm_min); 17 printf("S:%d\n", tm->tm_sec); 18 19 tm = localtime(&t); 20 printf("LOCALTIME=Y:%d ", tm->tm_year); 21 printf("M:%d ", tm->tm_mon); 22 printf("D:%d ", tm->tm_mday); ex4_19.c

More Related