Presentation is loading. Please wait.

Presentation is loading. Please wait.

Linux/UNIX Programming APUE (The Environment of a UNIX Process) [Ch. 7] 최 미 정 강원대학교 컴퓨터과학전공.

Similar presentations


Presentation on theme: "Linux/UNIX Programming APUE (The Environment of a UNIX Process) [Ch. 7] 최 미 정 강원대학교 컴퓨터과학전공."— Presentation transcript:

1 Linux/UNIX Programming APUE (The Environment of a UNIX Process) [Ch. 7] 최 미 정 강원대학교 컴퓨터과학전공

2 UNIX System Programming Page 2 강의 내용 Process Start Process Termination Command-Line Arguments Environment Variables Memory Layout of a C program Memory Allocation APUE (Understanding of UNIX Processes)

3 UNIX System Programming Page 3 Process Start Kernel exec system call C start-up routine user process int main(int argc, char * argv[]); call return APUE (Understanding of UNIX Processes)

4 UNIX System Programming Page 4 main() int main(int argc, char *argv[]); argc : the number of command-line arguments argv[] : an array of pointers to the arguments C Start-Up Routine Started by the kernel (by the exec system call) Take the command-line arguments and the environment from the kernel APUE (Understanding of UNIX Processes)

5 UNIX System Programming Page 5 Process Termination Normal Termination Return from main() Calling exit() // w/ cleanup process Calling _exit() // w/o cleanup process Abnormal Termination Calling abort() Terminated by a signal APUE (Understanding of UNIX Processes)

6 UNIX System Programming Page 6 exit() 프로세스를 정상적으로 종료한다. Cleanup Processing 을 수행한다. 모든 열려진 스트림 ( 파일 등 ) 을 닫고, 출력 버퍼의 내용을 디스크에 쓴다. status the exit status of a process ( 프로세스의 리턴 값으로 이해할 수 있음 ) 이 값은 UNIX shell 에 의해서 사용됨 (Shell Programming 에서 이용할 수 있음 ) #include void exit(int status); APUE (Understanding of UNIX Processes)

7 UNIX System Programming Page 7 _exit() 프로세스를 정상적으로 종료한다. Kernel 로 즉시 리턴한다. (Cleanup Processing 을 수행하지 않는다.) #include void _exit(int status); APUE (Understanding of UNIX Processes)

8 UNIX System Programming Page 8 atexit() exit handler 를 등록한다. 프로그램이 종료할 때 (exit() 이 호출되었을 때 ) 수행하는 함수들을 등록 프로세스당 32 개까지 등록 가능함 func An exit handler A function pointer exit() 은 exit handler 들을 등록된 역순으로 호출한다. #include void atexit(void (*func)(void)); returns: 0 if OK, nonzero on error APUE (Understanding of UNIX Processes)

9 UNIX System Programming Page 9 C Program Start and Termination APUE (Understanding of UNIX Processes) return call exit function user function main function C start-up routine exit handler standard I/O cleanup kernel user process exit (does not return) exit (does not return) exit (does not return) call return call return call return …… _exit exec _exit return call

10 UNIX System Programming Page 10 예제 : exit handlers (1/2) /* doatexit.c */ static void my_exit1(void), my_exit2(void); int main(void) { if (atexit(my_exit2) != 0) perror("can't register my_exit2"); if (atexit(my_exit1) != 0) perror("can't register my_exit1"); if (atexit(my_exit1) != 0) perror("can't register my_exit1"); printf("main is done\n"); return 0; } static void my_exit1(void) { printf("first exit handler\n"); } static void my_exit2(void) { printf("second exit handler\n"); } APUE (Understanding of UNIX Processes)

11 UNIX System Programming Page 11 예제 : exit handlers (2/2) APUE (Understanding of UNIX Processes) 실행 결과

12 UNIX System Programming Page 12 Command-Line Arguments exec() can pass command-line arguments to a new program. argc 에 Argument 개수를, argv 에 Argument 를 각각 전달한다. Part of normal operation of Unix Shells. argv[argc] is NULL. APUE (Understanding of UNIX Processes)

13 UNIX System Programming Page 13 예제 : echoarg.c #include // echoarg.c int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) /* echo all command-line args */ printf("argv[%d]: %s\n", i, argv[i]); exit(0); } APUE (Understanding of UNIX Processes)

14 UNIX System Programming Page 14 Environment Variables (1/2) 환경 변수 (environment variables) 는 부모 프로세스에서 자식 프로세스로 전달된다. 일반적으로, “.login” 또는 “.cshrc” 파일에서 환경 변수를 설정한다. 환경변수 선언 형식 : 이름 = 값 APUE (Understanding of UNIX Processes) $ env USER=ysmoon LOGNAME=ysmoon HOME=/home/prof/ysmoon PATH=/bin:/usr/bin:/usr/local/bin:/usr/ccs/bin:/usr/ucb:/usr/ope nwin/bin:/etc:. SHELL=/bin/csh...

15 UNIX System Programming Page 15 Environment Variables (2/2) APUE (Understanding of UNIX Processes)

16 UNIX System Programming Page 16 Environment List (1/2) 전역 변수 environ 을 이용하여 환경 변수에 접근한다. extern char ** environ; 각 항목은 " 환경 변수 이름 = 값 " 의 형식을 가진다. 각 문자열은 '\0' 로 끝난다. 환경 변수 리스트의 마지막은 NULL 포인터 argv 와 같은 구조이다. APUE (Understanding of UNIX Processes)

17 UNIX System Programming Page 17 Environment List (2/2) APUE (Understanding of UNIX Processes) "USER=ysmoon" "LOGNAME=ysmoon" "HOME=/home/prof/ysmoon" "PATH=/bin:/usr/local…" "MAIL =/var/mail/ysmoon" " SHELL=/bin/csh" NULL environ: environment pointer environment list environment strings...

18 UNIX System Programming Page 18 getenv() 환경 변수 리스트에서 이름이 name 인 것을 찾아서, 해당 값 ( 스트링 ) 에 대한 포인터를 리턴한다. 실패하면 NULL 포인터를 리턴 #include char *getenv(const char *name); Returns : pointer to value associated with name, NULL if not found APUE (Understanding of UNIX Processes)

19 UNIX System Programming Page 19 putenv() 환경 변수를 추가한다 str 은 "name=value" 형식의 문자열 성공적으로 실행된 경우 0 을 리턴 같은 이름의 환경 변수가 이미 있다면 새 값으로 변경된다 #include int putenv(const char *str); Returns: 0 if OK, nonzero on error APUE (Understanding of UNIX Processes)

20 UNIX System Programming Page 20 setenv(), unsetenv() setenv() 는 환경 변수 “name = value” 를 등록한다. name 의 환경변수가 이미 있을 경우 rewrite != 0 이면 새 값으로 변경되고, rewrite == 0 이면 값이 변경되지 않는다. unsetenv() 는 환경 변수 “name” 을 제거한다. #include int setenv(const char *name, const char *value, int rewrite); Returns: 0 if OK, nonzero on error void unsetenv(const char *name); APUE (Understanding of UNIX Processes)

21 UNIX System Programming Page 21 Memory Layout of a C Program (1/2) APUE (Understanding of UNIX Processes) uninitialized data (bss) stack heap initialized data text high address low address command-line arguments and environment variables initialized to zero by exec read from program file by exec Each area will be explained in the next slide…

22 UNIX System Programming Page 22 Text Segment Machine instructions (read-only, sharable) Initialized Data Segment e.g. int maxcount = 99; (initialized) Uninitialized Data Segment (bss: block started by symbol) e.g. long sum[1000]; Stack automatic variables, temporary variables, return address, caller's environment (registers) Heap dynamic memory allocation (e.g., malloc()) APUE (Understanding of UNIX Processes) Memory Layout of a C Program (2/2)

23 UNIX System Programming Page 23 Static Linking Library 사용된 라이브러리 루틴들이 ( 예 : printf) 실행파일에 추가된다 실행파일 크기 증가 Shared Library 실행파일에 라이브러리 루틴들을 포함하지 않는다. 공용의 메모리에 라이브러리 루틴을 로드하고 이를 공유한다. 프로그램 크기 감소 처음 실행될 때 오버헤드 발생 ( 메모리에 Loading 하는 과정이 필요할 수 있음 ) 라이브러리가 Version-Up 되어도 실행파일을 다시 컴파일 하지 않아도 됨 APUE (Understanding of UNIX Processes) Shared Libraries

24 UNIX System Programming Page 24 Memory Allocation (1/2) Dynamic allocation of memory from heap Provide suitable alignment ex) doubles must start at the addresses that are multiples of 8. #include void *malloc(size_t size); void *calloc(size_t nobj, size_t size); void *realloc(void *ptr, size_t newsize); returns: nonnull pointer if OK, NULL on error void free(void *ptr); APUE (Understanding of UNIX Processes)

25 UNIX System Programming Page 25 Memory Allocation (2/2) APUE (Understanding of UNIX Processes) malloc() allocates specified number of bytes ( 주어진 바이트 수를 할당 ) initial value of memory is indeterminate ( 초기 값은 결정되지 않음 ) calloc() allocates specified number of objects of specified size ( 주어진 크기의 객체를 주어진 개수만큼 할당 ) initialized to all 0 bits ( 초기 값은 0 으로 결정 ) realloc() changes size of previously allocated memory ( 기 할당된 메모리 영역에 추가 할당 ) initial value of new area is indeterminate ( 새 영역의 초기 값은 결정되지 않음 )

26 UNIX System Programming Page 26 예제 : alloc.c #include // alloc.c int main() { struct _cbuf { char buf[12]; } *cbuf; char *mbuf; if((mbuf = (char *)malloc(12)) == (char *)0) { perror("malloc():"); exit(-1); } strcpy(mbuf, "Kangwon"); if((cbuf = (struct _cbuf *)calloc(2, sizeof(struct _cbuf))) == (struct _cbuf *)0) { perror("calloc():"); exit(-1); } strcpy(cbuf->buf, " University"); if((mbuf = (char *)realloc(mbuf, 24)) == (char *)0) { perror("realloc():"); exit(-1); } strcat(mbuf, " National"); printf("%s%s\n", mbuf, cbuf); free(mbuf); free(cbuf); } APUE (Understanding of UNIX Processes)


Download ppt "Linux/UNIX Programming APUE (The Environment of a UNIX Process) [Ch. 7] 최 미 정 강원대학교 컴퓨터과학전공."

Similar presentations


Ads by Google