시스템에 설치된 운영체제에 대한 기본 정보 검색

Slides:



Advertisements
Similar presentations
Basic of Buffer Over Flow
Advertisements

Chapter 6: System Data Files and Information
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
6 레이스 컨디션.
Chapter 3 /etc/passwd real uid(진짜 사용자 식별번호), real gid(진짜 그룹 식별번호)
Linux/UNIX Programming APUE (Process Control)
C 프로그래밍.
8장 프로세스.
Department of Computer Engineering
2007 1학기 10 함수 활용.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Signal & Inter-Process Communication
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
Department of Computer Engineering
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.
UNIX Unbounded A Beginning Approach
6장. printf와 scanf 함수에 대한 고찰
6 프로세스 생성과 실행.
6 프로세스 생성과 실행.
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제 12장 I/O멀티플렉싱(Multiplexing)
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Department of Computer Engineering
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
4 시스템 정보.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Department of Computer Engineering
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Linux System Programming
4 시스템 정보.
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
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 프로세스 정보.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
Signal & Inter-Process Communication
Linux System Programming
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
#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.
-Part2- 제1장 1차원 배열이란 무엇인가.
Department of Computer Engineering
Execution with Unnecessary Privileges
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
argc, argv 의 사용방법 #include <stdio.h>
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
어서와 C언어는 처음이지 제23장.
어서와 C언어는 처음이지 제22장.
Presentation transcript:

시스템에 설치된 운영체제에 대한 기본 정보 검색 운영체제 기본 정보 검색 시스템에 설치된 운영체제에 대한 기본 정보 검색 시스템은 인텔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 함수 사용하기 (test1.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

파일과 디렉토리 관련 자원 검색 : 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-5] pathconf 함수 사용하기 (test2.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

로그인명 검색 : 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);

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

패스워드 파일 검색[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

그룹 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) { 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 파일의 구조 # 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; };

시간 관리 함수[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 함수 사용하기 (test3.c) # ex4_16.out Time(sec) : 1233361205

마이크로 초 단위로 시간 정보얻기 : 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) { 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 함수 사용하기 (test4.c) # ex4_17.out Time(sec) : 1233362365 Time(micro-sec) : 670913

초 단위 시간 정보 분해 : 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(시행)

[예제 4-19] gmtime, localtime 함수 사용하기 (test5.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("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);

[예제 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? 어떻게 해석해야하나?

초 단위 시간을 변환해 출력하기: 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) { 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 함수 사용하기 (test6.c) # ex4_21.out Time(sec) : 1233370759 Time(date) : Sat Jan 31 11:59:19 2009

프로세스의 정의 프로세스 실행중인 프로그램을 의미 고급언어로 작성한 프로그램은 기계어 프로그램으로 변환해야 실행이 가능 프로세서(processor) : 중앙처리장치(예: 펜티엄, 쿼드코어 등) 프로그램(program) : 사용자가 컴퓨터에 작업을 시키기 위한 명령어의 집합 고급언어로 작성한 프로그램은 기계어 프로그램으로 변환해야 실행이 가능

프로세스의 구조 메모리에 적재된 프로세스의 구조 텍스트 영역 : 실행 코드 저장 데이터 영역 : 전역 변수 저장 힙 : 동적메모리 할당을 위한 영역 스택 : 지역변수를 저장하는 영역

프로세스의 상태는 규칙에 따라 여러 상태로 변함 프로세스 상태 변화 프로세스의 상태는 규칙에 따라 여러 상태로 변함 커널의 프로세스 관리 기능이 프로세스의 스케줄링 담당 프로세스는 먼저 사용자 모드에서 실행 사용자모드에서 시스템 호출을 하면 커널 모드로 전환 수면 중이던 프로세스가 깨어나 실행 대기 상태로 전환되면 실행 준비 커널 모드에서 실행 중 입출력을 기다릴 때처럼 실행을 계속할 수 없으면 수면상태로 전환

현재 실행중인 프로세스 목록을 보려면 ps 명령 사용 프로세스 목록 보기 현재 실행중인 프로세스 목록을 보려면 ps 명령 사용 전체 프로세스를 보려면 –ef 옵션 사용 현재 실행중인 프로세스를 주기적으로 확인 솔라리스 기본 명령 : prstat, sdtprocess 공개소프트웨어 : top # ps PID TTY TIME CMD 678 pts/3 0:00 ksh 1766 pts/3 0:00 ps # ps -ef | more UID PID PPID C STIME TTY TIME CMD root 0 0 0 1월 30일 ? 175:28 sched root 1 0 0 1월 30일 ? 0:02 /sbin/init root 2 0 0 1월 30일 ? 0:00 pageout ......

프로세스 식별 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 0 0 0 1월 30일 ? 175:28 sched root 1 0 0 1월 30일 ? 0:02 /sbin/init root 2 0 0 1월 30일 ? 0:00 pageout ...... 부모 프로세스ID

[예제 5-1] getpid, getppid 함수 사용하기(test7.c) ex5_1.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 printf("PID : %d\n", (int)getpid()); 06 printf("PPID : %d\n", (int)getppid()); 07 08 return 0; 09 } # ex5_1.out PID : 2205 PPID : 678 678 프로세스는 콘쉘 # ps PID TTY TIME CMD 678 pts/3 0:00 ksh 2206 pts/3 0:00 ps

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);

[예제 5-2] getpgrp, getpgid 함수 사용하기 (test8.c) 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 printf("PID : %d\n", (int)getpid()); 06 printf("PGRP : %d\n", (int)getpgrp()); 07 printf("PGID(0) : %d\n", (int)getpgid(0)); 08 printf("PGID(2287) : %d\n", (int)getpgid(2287)); 09 10 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/6 0:00 ksh 2301 pts/6 0:00 ps 2287 pts/6 0:00 sleep

세션[1] 세션 POSIX 표준에서 제안한 개념 사용자가 로그인해 작업하고 있는 터미널 단위로 프로세스 그룹을 묶은 것

세션[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);

[예제 5-3] getsid 함수 사용하기 01 #include <unistd.h> ex5_3.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 int main(void) { 05 printf("PID : %d\n", (int)getpid()); 06 printf("PGID : %d\n", (int)getpgrp()); 07 printf("SID : %d\n", (int)getsid(0)); 08 09 return 0; 10 } # ex5_3.out PID : 2584 PGID : 2584 SID : 678 # ps PID TTY TIME CMD 678 pts/3 0:01 ksh 2585 pts/3 0:00 ps

프로세스 실행 시간 측정 프로세스 실행 시간의 구성 프로세스 실행 시간 측정 시스템 실행시간 : 커널 코드를 수행한 시간(시스템 호출로 소비한 시간) 사용자 실행시간 : 사용자 모드에서 프로세스를 실행한 시간 프로세스 실행 시간 측정 사용자 실행시간과 시스템 실행시간으로 나누어 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 : 자식프로스세의 시스템 모드 실행시간

[예제 5-4] times 함수 사용하기 # ex5_4.out Real time : 0.4 sec ... 08 int main(void) { 09 int i; 10 time_t t; 11 struct tms mytms; 12 clock_t t1, t2; 13 14 if ((t1 = times(&mytms)) == -1) { 15 perror("times 1"); 16 exit(1); 17 } 18 19 for (i = 0; i < 999999; i++) 20 time(&t); 21 22 if ((t2 = times(&mytms)) == -1) { 23 perror("times 2"); 24 exit(1); 25 } 26 27 printf("Real time : %.1f sec\n“,(double)(t2 - t1) / CLK_TCK); 28 printf("User time : %.1f sec\n“,(double)mytms.tms_utime / CLK_TCK); 29 printf("System time : %.1f sec\n“,(double)mytms.tms_stime / CLK_TCK); 30 31 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 */ 사용자 모드에서 시간을 소비하기 위한 반복문 처리

환경변수의 이해 환경변수 프로세스가 실행되는 기본 환경을 설정하는 변수 로그인명, 로그인 쉘, 터미널에 설정된 언어, 경로명 등 환경변수는 “환경변수=값”의 형태로 구성되며 관례적으로 대문자로 사용 현재 쉘의 환경 설정을 보려면 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 ...

환경변수의 사용[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) { 07 char **env; 08 09 env = environ; 10 while (*env) { 11 printf("%s\n", *env); 12 env++; 13 } 14 15 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`

환경변수의 사용[2] main 함수 인자 사용 int main(int argc, char **argv, char **envp) { ... } 01 #include <stdio.h> 02 03 int main(int argc, char **argv, char **envp) { 04 char **env; 05 06 env = envp; 07 while (*env) { 08 printf("%s\n", *env); 09 env++; 10 } 11 12 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

환경변수의 사용[3] 환경변수 검색: getenv(3) #include <stdlib.h> char *getenv(const char *name); 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 int main(void) { 05 char *val; 06 07 val = getenv("SHELL"); 08 if (val == NULL) 09 printf("SHELL not defined\n"); 10 else 11 printf("SHELL = %s\n", val); 12 13 return 0; 14 } [예제 5-7] getenv 함수 사용하기 (test11.c) # ex5_7.out SHELL = /bin/ksh

환경변수의 사용[4] 환경변수 설정: putenv(3) #include <stdlib.h> int putenv(char *string); ... 04 int main(void) { 05 char *val; 06 07 val = getenv("SHELL"); 08 if (val == NULL) 09 printf("SHELL not defined\n"); 10 else 11 printf("1. SHELL = %s\n", val); 12 13 putenv("SHELL=/usr/bin/csh"); 14 val = getenv("SHELL"); printf("2. SHELL = %s\n", val); 18 return 0; 19 } [예제 5-8] putenv 함수 사용하기 (test12.c) # ex5_8.out 1. SHELL = /usr/bin/ksh 2. SHELL = /usr/bin/csh 설정하려는 환경변수를 “환경변수=값”형태로 지정

환경변수의 사용[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);

[예제 5-9] setenv 함수 사용하기(test13.c) 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 int main(void) { 05 char *val; 06 07 val = getenv("SHELL"); 08 if (val == NULL) 09 printf("SHELL not defined\n"); 10 else 11 printf("1. SHELL = %s\n", val); 12 13 setenv("SHELL","/usr/bin/csh", 0); 14 val = getenv("SHELL"); 15 printf("2. SHELL = %s\n", val); 16 17 setenv("SHELL","/usr/bin/csh", 1); 18 val = getenv("SHELL"); 19 printf("3. SHELL = %s\n", val); 20 21 return 0; 22 } 환경변수의 덮어쓰기가 되지 않음 환경변수의 덮어쓰기 설정 # ex5_9.out 1. SHELL = /usr/bin/ksh 2. SHELL = /usr/bin/ksh 3. SHELL = /usr/bin/csh

실습(5장 연습문제) 반복문을 사용해 1~10000까지 더하면서 결과값을 반복적으로 출력하는 프로그램을 작성하고, 이 프로그램의 실행시간을 측정하라. 환경변수 HBENV를 새로 정의하고 값을 hbooks로 설정하는 프로그램을 작성하라 명령행 인자로 환경 변수명과 값을 입력받아 환경 변수를 설정하는 프로 그램을 작성하라