Download presentation
Presentation is loading. Please wait.
1
시스템에 설치된 운영체제에 대한 기본 정보 검색
운영체제 기본 정보 검색 시스템에 설치된 운영체제에 대한 기본 정보 검색 시스템은 인텔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]; };
2
[예제 4-1] uname 함수 사용하기 (test1.c)
01 #include <sys/utsname.h> 02 #include <stdlib.h> 03 #include <stdio.h> 04 05 int main(void) { struct utsname uts; 07 if (uname(&uts) == -1) { perror("uname"); exit(1); } 12 printf("OSname : %s\n", uts.sysname); printf("Nodename : %s\n", uts.nodename); printf("Release : %s\n", uts.release); printf("Version : %s\n", uts.version); printf("Machine : %s\n", uts.machine); 18 return 0; 20 } # ex4_1.out OSname : SunOS Nodename : hanbit Release : 5.10 Version : Generic_ Machine : i86pc
3
파일과 디렉토리 관련 자원 검색 : fpathconf(3), pathconf(3)
시스템 자원 정보 검색[3] 파일과 디렉토리 관련 자원 검색 : fpathconf(3), pathconf(3) 경로(path)나 파일기술자에 지정된 파일에 설정된 자원값이나 옵션값 리턴 name 사용할 상수 #include <unistd.h> long pathconf(const char *path, int name); long fpathconf(int fildes, int name);
4
[예제 4-5] pathconf 함수 사용하기 (test2.c)
01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { printf("Link Max : %ld\n", pathconf(".", _PC_LINK_MAX)); printf("Name Max : %ld\n", pathconf(".", _PC_NAME_MAX)); printf("Path Max : %ld\n", pathconf(".", _PC_PATH_MAX)); 08 return 0; 10 } # ex4_5.out Link Max : 32767 Name Max : 255 Path Max : 1024
5
로그인명 검색 : getlogin(3), cuserid(3)
사용자 정보 검색 사용자 정보, 그룹정보, 로그인 기록 검색 /etc/passwd, /etc/shadow, /etc/group, /var/adm/utmpx 로그인명 검색 : getlogin(3), cuserid(3) /var/adm/utmpx 파일을 검색해 현재 프로세스를 실행한 사용자의 로그인명을 리턴 현재 프로세스의 소유자 정보로 로그인명을 찾아 리턴 UID검색 #include <unistd.h> char *getlogin(void); #include <stdio.h> char *cuserid(char *s); #include <sys/types.h> #include <unistd.h> uid_t getuid(void); uid_t geteuid(void);
6
[예제 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) { uid_t uid, euid; char *name, *cname; 08 uid = getuid(); euid = geteuid(); 11 name = getlogin(); cname = cuserid(NULL); 14 printf("Login Name=%s,%s UID=%d, EUID=%d\n", name, cname, (int)uid, (int)euid); 16 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 월 29일 15:11 ex4_6.out setuid 설정 후 일반사용자가 이 파일을 실행하면?
7
패스워드 파일 검색[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
8
그룹 ID 검색하기 : getgid(2), getegid(2)
그룹 정보 검색 그룹 ID 검색하기 : getgid(2), getegid(2) #include <sys/types.h> #include <unistd.h> gid_t getgid(void); gid_t getegid(void); 01 #include <sys/types.h> 02 #include <unistd.h> 03 #include <stdio.h> 04 05 int main(void) { gid_t gid, egid; 07 gid = getgid(); egid = getegid(); 10 printf("GID=%d, EGID=%d\n", (int)gid, (int)egid); 12 return 0; 14 } [예제 4-12] getid, getegid 함수 사용하기 ex4_12.c # ex4_12.out GID=1, EGID=1
9
그룹 파일 검색[1] /etc/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; char **gr_mem; };
10
시간 관리 함수[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) { time_t tt; 07 time(&tt); printf("Time(sec) : %d\n", (int)tt); 10 return 0; 12 } [예제 4-16] time 함수 사용하기 (test3.c) # ex4_16.out Time(sec) :
11
마이크로 초 단위로 시간 정보얻기 : gettimeofday(3)
시간 관리 함수[2] 마이크로 초 단위로 시간 정보얻기 : gettimeofday(3) timeval 구조체 #include <sys/time.h> int gettimeofday(struct timeval *tp, void *tzp); int settimeofday(struct timeval *tp, void *tzp); struct timeval { time_t tv_sec; /* 초 */ suseconds_t tv_usec; /* 마이크로 초 */ }; .. 04 int main(void) { struct timeval tv; 06 gettimeofday(&tv, NULL); printf("Time(sec) : %d\n", (int)tv.tv_sec); printf("Time(micro-sec) : %d\n", (int)tv.tv_usec); 10 return 0; 12 } [예제 4-17] gettimeofday 함수 사용하기 (test4.c) # ex4_17.out Time(sec) : Time(micro-sec) :
12
초 단위 시간 정보 분해 : gmtime(3), localtime(3)
시간의 형태 변환 초 단위 시간 정보 분해 : 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); struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }; tm_mon(월) : 0(1월)~11(12월) tm_year(연도) : 년도 – 1900 tm_wday(요일) : 0(일)~6(토) tm_isdst(일광절약제) : 1(시행)
13
[예제 4-19] gmtime, localtime 함수 사용하기 (test5.c)
01 #include <time.h> 02 #include <stdio.h> 03 04 int main(void) { struct tm *tm; time_t t; 07 time(&t); printf("Time(sec) : %d\n", (int)t); 10 tm = gmtime(&t); printf("GMTIME=Y:%d ", tm->tm_year); printf("M:%d ", tm->tm_mon); printf("D:%d ", tm->tm_mday); printf("H:%d ", tm->tm_hour); printf("M:%d ", tm->tm_min); printf("S:%d\n", tm->tm_sec); 18 tm = localtime(&t); printf("LOCALTIME=Y:%d ", tm->tm_year); printf("M:%d ", tm->tm_mon); printf("D:%d ", tm->tm_mday);
14
[예제 4-19] gmtime, localtime 함수 사용하기
printf("H:%d ", tm->tm_hour); printf("M:%d ", tm->tm_min); printf("S:%d\n", tm->tm_sec); 26 return 0; 28 } # ex4_19.out Time(sec) : 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? 어떻게 해석해야하나?
15
초 단위 시간을 변환해 출력하기: ctime(3)
형식 지정 시간 출력[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) { time_t t; 06 time(&t); 08 printf("Time(sec) : %d\n", (int)t); printf("Time(date) : %s\n", ctime(&t)); 11 return 0; 13 } [예제 4-21] ctime 함수 사용하기 (test6.c) # ex4_21.out Time(sec) : Time(date) : Sat Jan 31 11:59:
16
프로세스의 정의 프로세스 실행중인 프로그램을 의미 고급언어로 작성한 프로그램은 기계어 프로그램으로 변환해야 실행이 가능
프로세서(processor) : 중앙처리장치(예: 펜티엄, 쿼드코어 등) 프로그램(program) : 사용자가 컴퓨터에 작업을 시키기 위한 명령어의 집합 고급언어로 작성한 프로그램은 기계어 프로그램으로 변환해야 실행이 가능
17
프로세스의 구조 메모리에 적재된 프로세스의 구조 텍스트 영역 : 실행 코드 저장 데이터 영역 : 전역 변수 저장
힙 : 동적메모리 할당을 위한 영역 스택 : 지역변수를 저장하는 영역
18
프로세스의 상태는 규칙에 따라 여러 상태로 변함
프로세스 상태 변화 프로세스의 상태는 규칙에 따라 여러 상태로 변함 커널의 프로세스 관리 기능이 프로세스의 스케줄링 담당 프로세스는 먼저 사용자 모드에서 실행 사용자모드에서 시스템 호출을 하면 커널 모드로 전환 수면 중이던 프로세스가 깨어나 실행 대기 상태로 전환되면 실행 준비 커널 모드에서 실행 중 입출력을 기다릴 때처럼 실행을 계속할 수 없으면 수면상태로 전환
19
현재 실행중인 프로세스 목록을 보려면 ps 명령 사용
프로세스 목록 보기 현재 실행중인 프로세스 목록을 보려면 ps 명령 사용 전체 프로세스를 보려면 –ef 옵션 사용 현재 실행중인 프로세스를 주기적으로 확인 솔라리스 기본 명령 : prstat, sdtprocess 공개소프트웨어 : top # ps PID TTY TIME CMD 678 pts/ :00 ksh 1766 pts/ :00 ps # ps -ef | more UID PID PPID C STIME TTY TIME CMD root 월 30일 ? :28 sched root 월 30일 ? 0:02 /sbin/init root 월 30일 ? 0:00 pageout ......
20
프로세스 식별 PID 검색: getpid(2) PPID 검색 : getppid(2)
#include <unistd.h> pid_t getpid(void); #include <unistd.h> pid_t getppid(void); # ps -ef | more UID PID PPID C STIME TTY TIME CMD root 월 30일 ? :28 sched root 월 30일 ? 0:02 /sbin/init root 월 30일 ? 0:00 pageout ...... 부모 프로세스ID
21
[예제 5-1] getpid, getppid 함수 사용하기(test7.c)
ex5_1.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { printf("PID : %d\n", (int)getpid()); printf("PPID : %d\n", (int)getppid()); 07 return 0; 09 } # ex5_1.out PID : 2205 PPID : 678 678 프로세스는 콘쉘 # ps PID TTY TIME CMD 678 pts/ :00 ksh 2206 pts/ :00 ps
22
PGID 검색 : getpgrp(2), getpgid(2)
프로세스 그룹 프로세스 그룹 관련 있는 프로세스를 묶은 것으로 프로세스 그룹ID(PGID)가 부여됨 작업제어 기능을 제공하는 C쉘이나 콘쉘은 명령을 파이프로 연결하여 프로세스 그룹 생성 가능 프로세스 그룹 리더 프로세스 그룹을 구성하는 프로세스 중 하나가 그룹 리더가 됨 프로세스 그룹 리더의 PID가 PGID 프로세스 그룹 리더는 변경 가능 PGID 검색 : getpgrp(2), getpgid(2) PGID 변경: setpgid(2) #include <unistd.h> pid_t getpgrp(void); pid_t getpgid(pid_t pid); #include <sys/types.h> #include <unistd.h> int setpgid(pid_t pid, pid_t pgid);
23
[예제 5-2] getpgrp, getpgid 함수 사용하기 (test8.c)
01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { printf("PID : %d\n", (int)getpid()); printf("PGRP : %d\n", (int)getpgrp()); printf("PGID(0) : %d\n", (int)getpgid(0)); printf("PGID(2287) : %d\n", (int)getpgid(2287)); 09 return 0; 11 } # ex5_2.out PID : 2297 PGRP : 2297 PGID(0) : 2297 PGID(2287) : 2285 실행방법 2287은 sleep의 PID $ ps -ef | more | sleep 300 & $ ps PID TTY TIME CMD 2278 pts/ :00 ksh 2301 pts/ :00 ps 2287 pts/ :00 sleep
24
세션[1] 세션 POSIX 표준에서 제안한 개념 사용자가 로그인해 작업하고 있는 터미널 단위로 프로세스 그룹을 묶은 것
25
세션[2] 세션 검색: getsid(2) 세션 생성: setsid(2) #include <unistd.h>
세션ID는 SVR4에서 정의한 개념 새로운 세션을 생성하면 해당 프로세스는 세션 리더가 되면 세션 리더의 PID가 세션ID 세션 생성: setsid(2) #include <unistd.h> pid_t getsid(pid_t pid); #include <sys/types.h> #include <unistd.h> pid_t setsid(void);
26
[예제 5-3] getsid 함수 사용하기 01 #include <unistd.h>
ex5_3.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { printf("PID : %d\n", (int)getpid()); printf("PGID : %d\n", (int)getpgrp()); printf("SID : %d\n", (int)getsid(0)); 08 return 0; 10 } # ex5_3.out PID : 2584 PGID : 2584 SID : 678 # ps PID TTY TIME CMD 678 pts/ :01 ksh 2585 pts/ :00 ps
27
프로세스 실행 시간 측정 프로세스 실행 시간의 구성 프로세스 실행 시간 측정
시스템 실행시간 : 커널 코드를 수행한 시간(시스템 호출로 소비한 시간) 사용자 실행시간 : 사용자 모드에서 프로세스를 실행한 시간 프로세스 실행 시간 측정 사용자 실행시간과 시스템 실행시간으로 나누어 tms 구조체에 저장 시간 단위는 클록틱(sysconf 함수에서 _SC_CLK_TCK로 검색한 값) tms 구조체 프로세스 실행시간 = 시스템 실행시간 + 사용자 실행시간 #include <sys/times.h> #include <limits.h> clock_t times(struct tms *buffer); struct tms { clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime; }; utime : 사용자 모드실행시간 stime : 시스템 모드실행시간 cutime : 자식프로세스의 사용자 모드 실행시간 cstime : 자식프로스세의 시스템 모드 실행시간
28
[예제 5-4] times 함수 사용하기 # ex5_4.out Real time : 0.4 sec
... 08 int main(void) { int i; time_t t; struct tms mytms; clock_t t1, t2; 13 if ((t1 = times(&mytms)) == -1) { perror("times 1"); exit(1); } 18 for (i = 0; i < ; i++) time(&t); 21 if ((t2 = times(&mytms)) == -1) { perror("times 2"); exit(1); } 26 printf("Real time : %.1f sec\n“,(double)(t2 - t1) / CLK_TCK); printf("User time : %.1f sec\n“,(double)mytms.tms_utime / CLK_TCK); printf("System time : %.1f sec\n“,(double)mytms.tms_stime / CLK_TCK); 30 return 0; 32 } # ex5_4.out Real time : 0.4 sec User time : 0.2 sec System time : 0.1 sec <limits.h> #define CLK_TCK ((clock_t) _sysconf(3)) /* 3 is _SC_CLK_TCK */ 사용자 모드에서 시간을 소비하기 위한 반복문 처리
29
환경변수의 이해 환경변수 프로세스가 실행되는 기본 환경을 설정하는 변수
로그인명, 로그인 쉘, 터미널에 설정된 언어, 경로명 등 환경변수는 “환경변수=값”의 형태로 구성되며 관례적으로 대문자로 사용 현재 쉘의 환경 설정을 보려면 env 명령을 사용 # env _=/usr/bin/env LANG=ko HZ=100 PATH=/usr/sbin:/usr/bin:/usr/local/bin:. LOGNAME=jw MAIL=/usr/mail/jw SHELL=/bin/ksh HOME=/export/home/jw TERM=ansi PWD=/export/home/jw/syspro/ch5 TZ=ROK ...
30
환경변수의 사용[1] 전역변수 사용 : environ #include <stdlib.h>
extern char **environ; 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 extern char **environ; 05 06 int main(void) { char **env; 08 env = environ; while (*env) { printf("%s\n", *env); env++; } 14 return 0; 16 } [예제 5-5] environ 전역 변수사용하기 (test9.c) # ex5_5.out _=ex5_5.out LANG=ko HZ=100 PATH=/usr/sbin:/usr/bin:/usr/local/bin:. LOGNAME=jw MAIL=/usr/mail/jw SHELL=/bin/ksh HOME=/export/home/jw TERM=ansi PWD=/export/home/jw/syspro/ch5 TZ=ROK`
31
환경변수의 사용[2] main 함수 인자 사용 int main(int argc, char **argv, char **envp) { ... } 01 #include <stdio.h> 02 03 int main(int argc, char **argv, char **envp) { char **env; 05 env = envp; while (*env) { printf("%s\n", *env); env++; } 11 return 0; 13 } [예제 5-6] main 함수 인자 (test10.c) # ex5_6.out _=ex5_6.out LANG=ko HZ=100 PATH=/usr/sbin:/usr/bin:/usr/local/bin:. LOGNAME=jw MAIL=/usr/mail/jw SHELL=/bin/ksh HOME=/export/home/jw TERM=ansi PWD=/export/home/jw/syspro/ch5 TZ=ROK
32
환경변수의 사용[3] 환경변수 검색: getenv(3) #include <stdlib.h>
char *getenv(const char *name); 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 int main(void) { char *val; 06 val = getenv("SHELL"); if (val == NULL) printf("SHELL not defined\n"); else printf("SHELL = %s\n", val); 12 return 0; 14 } [예제 5-7] getenv 함수 사용하기 (test11.c) # ex5_7.out SHELL = /bin/ksh
33
환경변수의 사용[4] 환경변수 설정: putenv(3) #include <stdlib.h>
int putenv(char *string); ... 04 int main(void) { char *val; 06 val = getenv("SHELL"); if (val == NULL) printf("SHELL not defined\n"); else printf("1. SHELL = %s\n", val); 12 putenv("SHELL=/usr/bin/csh"); 14 val = getenv("SHELL"); printf("2. SHELL = %s\n", val); return 0; 19 } [예제 5-8] putenv 함수 사용하기 (test12.c) # ex5_8.out 1. SHELL = /usr/bin/ksh 2. SHELL = /usr/bin/csh 설정하려는 환경변수를 “환경변수=값”형태로 지정
34
환경변수의 사용[5] 환경변수 설정: setenv(3) 환경변수 설정 삭제: unsetenv(3)
envname : 환경변수명 지정 envval : 환경변수 값 지정 overwrite : 덮어쓰기 여부 지정, 0이 아니면 덮어쓰고, 0이면 덮어쓰지 않음 환경변수 설정 삭제: unsetenv(3) #include <stdlib.h> int setenv(const char *envname, const char *envval, int overwrite); #include <stdlib.h> int unsetenv(const char *name);
35
[예제 5-9] setenv 함수 사용하기(test13.c)
01 #include <stdlib.h> 02 #include <stdio.h> 03 04 int main(void) { char *val; 06 val = getenv("SHELL"); if (val == NULL) printf("SHELL not defined\n"); else printf("1. SHELL = %s\n", val); 12 setenv("SHELL","/usr/bin/csh", 0); val = getenv("SHELL"); printf("2. SHELL = %s\n", val); 16 setenv("SHELL","/usr/bin/csh", 1); val = getenv("SHELL"); printf("3. SHELL = %s\n", val); 20 return 0; 22 } 환경변수의 덮어쓰기가 되지 않음 환경변수의 덮어쓰기 설정 # ex5_9.out 1. SHELL = /usr/bin/ksh 2. SHELL = /usr/bin/ksh 3. SHELL = /usr/bin/csh
36
실습(5장 연습문제) 반복문을 사용해 1~10000까지 더하면서 결과값을 반복적으로 출력하는 프로그램을 작성하고, 이 프로그램의 실행시간을 측정하라. 환경변수 HBENV를 새로 정의하고 값을 hbooks로 설정하는 프로그램을 작성하라 명령행 인자로 환경 변수명과 값을 입력받아 환경 변수를 설정하는 프로 그램을 작성하라
Similar presentations