Linux/UNIX Programming APUE (The Environment of a Linux/Unix Process)

Slides:



Advertisements
Similar presentations
Basic of Buffer Over Flow
Advertisements

Linux/UNIX Programming
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Linux/UNIX Programming APUE (Process Control)
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
8장 프로세스.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Department of Computer Engineering
Linux/UNIX Programming
Department of Computer Engineering
Department of Computer Science and Engineering
공학기초설계 Youn-Hee Han 강의 소개 & MinGW & gcc 공학기초설계 Youn-Hee Han
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
C언어: 배열 (Arrays).
6 프로세스 생성과 실행.
6 프로세스 생성과 실행.
조 병 규 Software Quality Lab. 한국교통대학교
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Chapter 10 Pointer Applications.
Department of Computer Engineering
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Department of Computer Engineering
12장 파이프.
07. 디바이스 드라이버의 초기화와 종료 김진홍
Computer Architecture
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Term Project Team Member
Department of Computer Engineering
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
6주차: Functions in C and Others
Linux/UNIX Programming APUE (Process Environment)
Department of Computer Engineering
프로그래밍 랩 – 7주 리스트.
Department of Computer Engineering
5 프로세스 정보.
adopted from KNK C Programming : A Modern Approach
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Memory & Data Management.
Linux/UNIX Programming
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
운영체제 (Operating Systems) (Memory Management Strategies)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Department of Computer Engineering
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Linux/UNIX Programming
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
Department of Computer Engineering
Canary value 스택 가드(Stack Guard).
PHP 웹 프로그래밍 (PHP Web Programming) 미리 정의된 함수 문양세 강원대학교 IT대학 컴퓨터과학전공.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
구조체(struct)와 공용체(union)
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
argc, argv 의 사용방법 #include <stdio.h>
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Linux/UNIX Programming APUE (The Environment of a Linux/Unix Process) 문양세 강원대학교 IT대학 컴퓨터과학전공

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

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

main() int main(int argc, char *argv[]); C Start-Up Routine APUE (Understanding of UNIX Processes) 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

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

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

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

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

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

예제: exit handlers (1/2) /* doatexit.c */ APUE (Understanding of UNIX Processes) /* 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"); 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");

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

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

예제: echoarg.c #include <stdio.h> // echoarg.c APUE (Understanding of UNIX Processes) #include <stdio.h> // 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); }

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

Environment Variables (2/2) APUE (Understanding of UNIX Processes)

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

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

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

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

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

Env Manipulation Example (1/2) APUE (Understanding of UNIX Processes)

Env Manipulation Example (2/2) APUE (Understanding of UNIX Processes) Why not change ???

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

Memory Layout of a C Program (2/2) APUE (Understanding of UNIX Processes) 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())

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

Memory Allocation (1/2) Dynamic allocation of memory from heap APUE (Understanding of UNIX Processes) #include <stdlib.h> 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); Dynamic allocation of memory from heap Provide suitable alignment ex) doubles must start at the addresses that are multiples of 8.

Memory Allocation (2/2) malloc() calloc() realloc() 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 (새 영역의 초기 값은 결정되지 않음)

예제: alloc.c APUE (Understanding of UNIX Processes) #include <stdio.h> // alloc.c #include <string.h> #include <stdlib.h> 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);

예제: morealloc.c (1/3) APUE (Understanding of UNIX Processes)

예제: morealloc.c (2/3) APUE (Understanding of UNIX Processes)

예제: morealloc.c (3/3) APUE (Understanding of UNIX Processes)

Homework#9