4 시스템 정보.

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

Basic of Buffer Over Flow
Chapter 6: System Data Files and Information
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
6 레이스 컨디션.
4. 시스템 관리 기본 naldo.
Linux/UNIX Programming APUE (Process Control)
Linux System Programming
Department of Computer Engineering
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
1 유닉스 시스템 프로그래밍 개요.
C 10장. 함수의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Network Lab. Seoung Hyeon, Lee
리눅스 커널의 이해 중에서 1장. 소개 이원구 네트워크 실험실.
6 프로세스 생성과 실행.
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
제 12장 I/O멀티플렉싱(Multiplexing)
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Department of Computer Engineering
Step Motor Device Driver
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
4 시스템 정보.
시스템에 설치된 운영체제에 대한 기본 정보 검색
5. 네트워킹 사용자 표시 : users/ rusers/who/w users 지역 호스트 상에 있는 사용자의 간단한 목록 표시
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
3 파일과 디렉토리.
Linux/UNIX Programming APUE (Files & Directories)
Term Project Team Member
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
6장 파일 및 레코드 잠금.
Department of Computer Engineering
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
5 프로세스 정보.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제 11 장 전처리기.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
문자 디바이스 드라이버 임베디드 시스템.
Memory & Data Management.
Linux System Programming
네트워크 프로그래밍의 이해 School of Electronics and Information.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
4장 자료형.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Execution with Unnecessary Privileges
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
어서와 C언어는 처음이지 제22장.
3장 파일 다루기 한빛미디어(주).
배열, 포인터, 함수 Review & 과제 1, 2.
한국 휴렛팩커드/고객지원사업본부/IT 기술사업부 박기영
Presentation transcript:

4 시스템 정보

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

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

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

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

[예제 4-1] uname 함수 사용하기 01 #include <sys/utsname.h> ex4_1.c 01 #include <sys/utsname.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { 06 struct utsname uts; 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

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

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

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

[예제 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+mmx pentium_pro pentium+mmx pentium i486 i386 i86

[예제 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); 호스트 이름 변경

[예제 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

시스템 정보 검색과 설정 (4) : Linux sysinfo(2) in 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 */ };

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

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

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

[예제 4-4] sysconf 함수 사용하기 01 #include <unistd.h> 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

시스템 자원 정보 검색 (3) 파일과 디렉토리 관련 자원 검색 : fpathconf(3), pathconf(3) name 사용할 상수 #include <unistd.h> long pathconf(const char *path, int name); long fpathconf(int fildes, int name);

[예제 4-5] pathconf 함수 사용하기 01 #include <unistd.h> 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

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

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

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

[예제 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_t uid, 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 설정 후 일반사용자가 이 파일을 실행하면?

/etc/passwd 파일 검색 (1) /etc/passwd 파일의 구조 # 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

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

[예제 4-7] getpwuid 함수 사용하기 01 #include <unistd.h> ex4_7.c 01 #include <unistd.h> 02 #include <pwd.h> 03 04 int main(void) { 05 struct passwd *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

[예제 4-8] getpwnam 함수 사용하기 01 #include <pwd.h> 02 ex4_8.c 01 #include <pwd.h> 02 03 int main(void) { 04 struct passwd *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

/etc/passwd 파일 검색 (3) /etc/passwd 파일 순차적으로 읽기 #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 struct passwd *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 } [예제 4-9] getpwent 함수 사용하기 ex4_9.c # ex4_9.out UID: 0, LoginName: root UID: 1, LoginName: daemon UID: 2, LoginName: bin

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

섀도우 파일 검색 (2) /etc/shadow 파일 읽기 : getspnam(3) spwd 구조체 #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; };

[예제 4-10] getspnam 함수 사용하기 01 #include <shadow.h> 02 ex4_10.c 01 #include <shadow.h> 02 03 int main(void) { 04 struct spwd *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

섀도우 파일 검색 (3) /etc/shadow 파일 순차적으로 읽기 #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 struct spwd *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 } [예제 4-11] getspent 함수 사용하기 ex4_11.c # ex4_11.out LoginName: root, Passwd: lyTy6ZkWh4RYw LoginName: daemon, Passwd: NP LoginName: bin, Passwd: NP

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

그룹 정보 검색 (2) 그룹 ID 검색하기 : getgid(2), 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_t gid, 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 } [예제 4-12] getid, getegid 함수 사용하기 ex4_12.c # ex4_12.out GID=1, EGID=1

그룹 파일 검색 (1) /etc/group 파일의 구조 group 구조체 # 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; // 그룹 멤버 로그인명 목록 };

그룹 파일 검색 (2) /etc/group 파일 검색 : getgrnam(3), getgrgid(3) #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);

[예제 4-13] getgrnam 함수 사용하기 01 #include <grp.h> 02 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

[예제 4-14] getgrent 함수 사용하기 01 #include <grp.h> 02 ex4_14.c 01 #include <grp.h> 02 03 int main(void) { 04 struct group *grp; 05 int n,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

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

로그인 기록 검색 (2) utmp 구조체 (in Linux) /* * 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 */ };

로그인 기록 검색 (3) utmp 구조체 (in Linux) 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 */ };

로그인 기록 검색 (4) 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이 가질 수 있는 가장 큰 값이다.

로그인 기록 검색 (5) /var/adm/utmpx 파일 순차적으로 읽기 # ex4_15.out LoginName Line #include <utmpx.h> struct utmpx *getutxent(void); // utmp 구조체 정보를 순차적으로 읽기 void setutxent(void); // 파일 오프셋을 파일 처음으로 이동 void endutxent(void); // 파일 오프셋을 파일 마지막으로 이동 int utmpxname(const char *file); ... 05 int main(void) { 06 struct utmpx *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 } [예제 4-15] getutxent 함수 사용하기 ex4_15.c # ex4_15.out LoginName Line --------------- root console root pts/3 root pts/5 root pts/4

로그인 기록 검색 (6) /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에 저장 #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);

시간 관리 함수 (1) 유닉스 시스템에서 시간관리 초 단위로 현재 시간 정보 얻기 : time(2) 1970년 1월 1일 0시 0분 0초(UTC)를 기준으로 현재까지 경과한 시간을 초 단위로 저장하고 이를 기준으로 시간 정보 관리 초 단위로 현재 시간 정보 얻기 : time(2) #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_t tt; 07 08 time(&tt); 09 printf("Time(sec) : %d\n", (int)tt); 10 11 return 0; 12 } [예제 4-16] time 함수 사용하기 ex4_16.c # ex4_16.out Time(sec) : 1233361205

시간 관리 함수 (2) 마이크로 초 단위로 시간 정보얻기 : gettimeofday(3) timeval 구조체 #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 struct timeval tv; 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 } [예제 4-17] gettimeofday 함수 사용하기 ex4_17.c # ex4_17.out Time(sec) : 1233362365 Time(micro-sec) : 670913

시간 관리 함수 (3) 시간대 정보 : tzset(3) 현재 지역의 시간대로 시간을 설정 전역변수 4개에 정보를 설정 timezone : UTC와 지역 시간대와 시차를 초 단위로 저장 altzone : UTC와 일광절약제 등으로 보정된 지역시간대와의 시차를 초 단위로 저장 daylight : 일광절약제를 시행하면 0이 아니고, 아니면 0 tzname : 지역시간대와 보정된 시간대명을 약어로 저장 #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 } [예제 4-18] tzset 함수 사용하기 ex4_18.c # ex4_18.out Timezone : -32400 Altzone : -36000 Daylight : 1 TZname[0] : KST TZname[1] : KDT UTC와 9시간(32,400초) 시차가 발생

시간의 형태 변환 (1) tm 구조체 초단위 시스템 시간을 사용자가 인식하기 쉬운 형태로 변환하여 저장할 수 있는 구조체 시간 정보를 시분초 및 년월일 정보 등으로 표현 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; // 일과제 시행 여부 };

시간의 형태 변환 (2) 초 단위 시간 정보 분해 : gmtime(3), localtime(3) 초단위 시간을 인자로 받아 tm 구조체 반환 gmtime은 UTC기준, localtime은 지역시간대 기준으로 환산 초 단위 시간으로 역산 : mktime(3) tm 구조체로 주어진 시간 정보를 초단위 시간 정보로 역산 #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);

[예제 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

[예제 4-19] gmtime, localtime 함수 사용하기 23 printf("H:%d ", tm->tm_hour); 24 printf("M:%d ", tm->tm_min); 25 printf("S:%d\n", tm->tm_sec); 26 27 return 0; 28 } # ex4_19.out Time(sec) : 1233369331 GMTIME=Y:109 M:0 D:31 H:2 M:35 S:31 LOCALTIME=Y:109 M:0 D:31 H:11 M:35 S:31 연도가 109? 어떻게 해석해야하나?

[예제 4-20] mktime 함수 사용하기 01 #include <time.h> ex4_20.c 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("Current Time(sec) : %d\n", (int)t); 10 11 tm.tm_year = 109; 12 tm.tm_mon = 11; 13 tm.tm_mday = 31; 14 tm.tm_hour = 12; 15 tm.tm_min = 30; 16 tm.tm_sec = 0; 17 18 t = mktime(&tm); 19 printf("2009/12/31 12:30:00 Time(sec) : %d\n", (int)t); 20 21 return 0; 22 } # ex4_20.out Current Time(sec) : 1233370219 2009/12/31 12:30:00 Time(sec) : 1262226600

형식 지정 시간 출력 (1) 초 단위 시간을 변환해 출력하기: ctime(3) #include <time.h> char *ctime(const time_t *clock); 초단위 시간을 시분초 시간의 문자열로 변환 01 #include <time.h> 02 #include <stdio.h> 03 04 int main(void) { 05 time_t t; 06 07 time(&t); 08 09 printf("Time(sec) : %d\n", (int)t); 10 printf("Time(date) : %s\n", ctime(&t)); 11 12 return 0; 13 } [예제 4-21] ctime 함수 사용하기 ex4_21.c # ex4_21.out Time(sec) : 1233370759 Time(date) : Sat Jan 31 11:59:19 2009

형식 지정 시간 출력 (2) tm 구조체 시간을 변환해 출력하기: asctime(3) #include <time.h> char *asctime(const struct tm *tm); tm 구조체 시간을 시분초 시간의 문자열로 변환 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 tm = localtime(&t); 10 11 printf("Time(sec) : %d\n", (int)t); 12 printf("Time(date) : %s\n", asctime(tm)); 13 14 return 0; 15 } [예제 4-22] asctime 함수 사용하기 ex4_22.c # ex4_22.out Time(sec) : 1233371061 Time(date) : Sat Jan 31 12:04:21 2009

형식 지정 시간 출력 (3) 출력 형식 기호 사용 : strftime(3) s : 출력할 시간 정보를 저장할 문자열 주소 maxsize : s의 크기 format : 출력 형식 – 형식 지정자로 출력형식을 정의한 문자열 timeptr : 출력할 시간정보를 저장한 구조체 주소 #include <time.h> size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);

형식 지정 시간 출력 (4) 시간정보 출력 형식 지정자

형식 지정 시간 출력 (5)

[예제 4-23] strftime 함수 사용하기 ex4_23.c # ex4-23.out 01 #include <time.h> 02 #include <stdio.h> 03 04 char *output[] = { 05 "%x %X", 06 "%G֙‚ % mਘ %dੌ %U઱ %H:%M", 07 "%r" 08 }; 09 10 int main(void) { 11 struct tm *tm; 12 int n; 13 time_t t; 14 char buf[257]; 15 16 time(&t); 17 tm = localtime(&t); 18 19 for (n = 0; n < 3; n++) { 20 strftime(buf, sizeof(buf), output[n], tm); 21 printf("%s = %s\n", output[n], buf); 22 } 23 24 return 0; 25 } # ex4-23.out %x %X = 01/31/09 12:43:12 %G년 %m월 %d일 %U주 %H:%M = 2009년 01월 31일 04주 12:43 %r = 12:43:12 PM

과제물 #3 1. 과제물 내용 현재 시스템에서 제일 마지막에 로그인하였던 사용자를 식별하고, 이 사용자가 가장 최근에 로그인한 후에 수정한 홈디렉토리 항목(파일, 디렉토리)을 모두 찾아 그 항목에 대한 자세한 정보를 출력하여라. 2. 제출일 - 2012년 4월 9일 수업시간 3. 제출물 - 프로그램 설계에 대한 구체적인 설명 - 프로그램 소스 - 프로그램 실행 예