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

13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Linux/UNIX ProgrammingLinux/UNIX ProgrammingLinux/UNIX ProgrammingLinux/UNIX Programming

APUE APUE (The Environment of a UNIX Process)(The Environment of a UNIX Process)(The Environment of a UNIX Process) (The Environment of a UNIX Process)

문양세문양세강원대학교강원대학교 ITIT대학대학 컴퓨터과학전공컴퓨터과학전공

Page 2: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

강의강의 내용내용APUE (Understanding of UNIX Processes)

Process Start

Process Termination

Command-Line Arguments

Environment Variables

M L t f C Memory Layout of a C program

Memory Allocation

UNIX System Programmingby Yang-Sae MoonPage 2

Page 3: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Process StartProcess StartAPUE (Understanding of UNIX Processes)

Kernel exec system call

C start-up routineuser process C start up routineuser process

call return

int main(int argc, char * argv[]);

UNIX System Programmingby Yang-Sae MoonPage 3

Page 4: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

main()main()APUE (Understanding of UNIX Processes)

int main(int argc, char *argv[]);

• argc : the number of command line arguments• 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 kernelTake the command line arguments and the environment from the kernel

UNIX System Programmingby Yang-Sae MoonPage 4

Page 5: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Process TerminationProcess TerminationAPUE (Understanding of UNIX Processes)

Normal Termination

Return from main()• Return from main()

• Calling exit() // w/ cleanup process

ll () l• Calling _exit() // w/o cleanup process

Abnormal Termination

• Calling abort()

• Terminated by a signal

UNIX System Programmingby Yang-Sae MoonPage 5

Page 6: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

exit()exit()APUE (Understanding of UNIX Processes)

#include <stdlib.h>

id it(i t t t )

프로세스를 정상적으로 종료한다

void exit(int status);

프로세스를 정상적으로 종료한다.

Cleanup Processing 을 수행한다.

• 모든 열려진 스트림(파일 등)을 닫고,

• 출력 버퍼의 내용을 디스크에 쓴다.

status

• the exit status of a process (프로세스의 리턴 값으로 이해할 수 있음)the exit status of a process (프로세스의 리턴 값으로 이해할 수 있음)

• 이 값은 UNIX shell 에 의해서 사용됨 (Shell Programming에서 이용할 수 있음)

UNIX System Programmingby Yang-Sae MoonPage 6

Page 7: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

_exit()_exit()APUE (Understanding of UNIX Processes)

#include <unistd.h>

id it(i t t t )

프로세스를 정상적으로 종료한다

void _exit(int status);

프로세스를 정상적으로 종료한다.

Kernel로 즉시 리턴한다.(Cl P i 을 수행하지 않는다 )(Cleanup Processing을 수행하지 않는다.)

UNIX System Programmingby Yang-Sae MoonPage 7

Page 8: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

atexit()atexit()APUE (Understanding of UNIX Processes)

#include <stdlib.h>

void atexit(void (*func)(void));

exit handler 를 등록한다

void atexit(void (*func)(void));returns: 0 if OK, nonzero on error

exit handler 를 등록한다.

• 프로그램이 종료할 때(exit()이 호출되었을 때) 수행하는 함수들을 등록

프로세스당 32개까지 등록 가능함• 프로세스당 32개까지 등록 가능함

func

• An exit handler

• A function pointer

exit()은 exit handler들을 등록된 역순으로 호출한다.

UNIX System Programmingby Yang-Sae MoonPage 8

Page 9: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

C Program Start and TerminationC Program Start and TerminationAPUE (Understanding of UNIX Processes)

userfunction

exit handler_exitre

turn

call

exitfunction

main exit handler user exit(d t t )

……

_exitfunctionfunction

exit handler

t d d I/O

process(does not return)

retu

rn

call

C start-uproutine

standard I/Ocleanup_exit

kernel

exec

UNIX System Programmingby Yang-Sae MoonPage 9

Page 10: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

예제예제: exit handlers (1/2): exit handlers (1/2)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");

if (atexit(my_exit1) != 0)perror("can't register my exit1");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");

}

UNIX System Programmingby Yang-Sae MoonPage 10

Page 11: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

예제예제: exit handlers (2/2): exit handlers (2/2)APUE (Understanding of UNIX Processes)

실행 결과

UNIX System Programmingby Yang-Sae MoonPage 11

Page 12: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

CommandCommand--Line ArgumentsLine ArgumentsAPUE (Understanding of UNIX Processes)

exec() can pass command-line arguments to a new program.

• argc에 Argument 개수를• argc에 Argument 개수를,

• argv에 Argument를 각각 전달한다.

Part of normal operation of Unix Shells.

argv[argc] is NULL.

UNIX System Programmingby Yang-Sae MoonPage 12

Page 13: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

예제예제: echoarg.c: echoarg.cAPUE (Understanding of UNIX Processes)

#include <stdio.h> // echoarg.c

int main(int argc char *argv[]) {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]);printf("argv[%d]: %s\n", i, argv[i]);

exit(0);}

UNIX System Programmingby Yang-Sae MoonPage 13

Page 14: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Environment Variables (1/2Environment Variables (1/2) ) –– skip skip APUE (Understanding of UNIX Processes)

환경 변수(environment variables)는 부모 프로세스에서 자식 프로세스로

전달된다.전달된다.

일반적으로, “.login” 또는 “.cshrc” 파일에서 환경 변수를 설정한다.

환경변수 선언 형식: 이름=값

$ envUSER=ysmoonLOGNAME=ysmoonHOME=/home/prof/ysmoon/ /p /yPATH=/bin:/usr/bin:/usr/local/bin:/usr/ccs/bin:/usr/ucb:/usr/ope

nwin/bin:/etc:.SHELL=/bin/csh......

UNIX System Programmingby Yang-Sae MoonPage 14

Page 15: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Environment Variables (2/2Environment Variables (2/2) ) –– skipskipAPUE (Understanding of UNIX Processes)

UNIX System Programmingby Yang-Sae MoonPage 15

Page 16: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Environment List (1/2Environment List (1/2) ) –– skipskipAPUE (Understanding of UNIX Processes)

전역 변수 environ을 이용하여 환경 변수에 접근한다.

extern char ** environ;

각 항목은 "환경 변수 이름=값" 의 형식을 가진다.

• 각 문자열은 '\0'로 끝난다• 각 문자열은 \0로 끝난다.

• 환경 변수 리스트의 마지막은 NULL 포인터

argv 와 같은 구조이다.

UNIX System Programmingby Yang-Sae MoonPage 16

Page 17: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Environment List (2/2Environment List (2/2) ) –– skipskipAPUE (Understanding of UNIX Processes)

"USER "i

environment pointer

environmentlist

environmentstrings

"USER=ysmoon""LOGNAME=ysmoon""HOME=/home/prof/ysmoon"

environ:

"PATH=/bin:/usr/local…""MAIL =/var/mail/ysmoon"

"SHELL=/bin/csh"

...

NULL

UNIX System Programmingby Yang-Sae MoonPage 17

Page 18: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

getenvgetenv() () –– skipskipAPUE (Understanding of UNIX Processes)

#include <stdlib.h>

h * t ( t h * )char *getenv(const char *name);

Returns : pointer to value associated with name, NULL if not found

환경 변수 리스트에서 이름이 name 인 것을 찾아서,

해당 값(스트링)에 대한 포인터를 리턴한다.

실패하면 NULL 포인터를 리턴실패하면 인터를 리턴

UNIX System Programmingby Yang-Sae MoonPage 18

Page 19: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

putenvputenv() () –– skipskipAPUE (Understanding of UNIX Processes)

#include <stdlib.h>

i t t ( t h * t )int putenv(const char *str);

Returns: 0 if OK, nonzero on error

환경 변수를 추가한다

str은 "name=value" 형식의 문자열

성공적으로 실행된 경우 0을 리턴성공적 실행된 경우 을 리턴

같은 이름의 환경 변수가 이미 있다면 새 값으로 변경된다

UNIX System Programmingby Yang-Sae MoonPage 19

Page 20: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

setenvsetenv(), (), unsetenvunsetenv() () –– skipskipAPUE (Understanding of UNIX Processes)

#include <stdlib.h>int setenv(const char *name, const char *value, int rewrite);

R t 0 if OKReturns: 0 if OK, nonzero on error

void unsetenv(const char *name);

setenv()는 환경 변수 “name = value”를 등록한다.

name 의 환경변수가 이미 있을 경우

• rewrite != 0 이면 새 값으로 변경되고,

• rewrite == 0 이면 값이 변경되지 않는다.

unsetenv()는 환경 변수 “name”을 제거한다.unsetenv()는 환경 변수 name 을 제거한다.

UNIX System Programmingby Yang-Sae MoonPage 20

Page 21: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Memory Layout of a C Program (1/2)Memory Layout of a C Program (1/2)APUE (Understanding of UNIX Processes)

high address d li

stack

high address command-line argumentsand environment variables

heap

uninitialized data(bss)

heap

initialized data

initialized to zero by exec

d f fil b text

low address

read from program file by exec

UNIX System Programmingby Yang-Sae MoonPage 21

Each area will be explained in the next slide…

Page 22: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

APUE (Understanding of UNIX Processes)Memory Layout of a C Program (2/2)Memory Layout of a C Program (2/2)

Text Segment

• Machine instructions (read-only, sharable)( y, )

Initialized Data Segment

• e.g. int maxcount = 99; (initialized)g ; ( )

Uninitialized Data Segment

• (bss: block started by symbol)( y y )

• e.g. long sum[1000];

Stack

• automatic variables, temporary variables, return address, caller's environment (registers)

Heap

• dynamic memory allocation (e.g., malloc())

UNIX System Programmingby Yang-Sae MoonPage 22

Page 23: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

APUE (Understanding of UNIX Processes)Shared LibrariesShared Libraries

Static Linking Library

• 사용된 라이브러리 루틴들이(예: printf) 실행파일에 추가된다사용된 라이브러리 루틴들이(예 p ) 실행파일에 추가된다

• 실행파일 크기 증가

Shared Library

• 실행파일에 라이브러리 루틴들을 포함하지 않는다.

• 공용의 메모리에 라이브러리 루틴을 로드하고 이를 공유한다.

• 프로그램 크기 감소

처음 실행될 때 오버헤드 발생 메모리에 하는 과정이 필요할 수 있음• 처음 실행될 때 오버헤드 발생 (메모리에 Loading하는 과정이 필요할 수 있음)

• 라이브러리가 Version-Up되어도 실행파일을 다시 컴파일 하지 않아도 됨

UNIX System Programmingby Yang-Sae MoonPage 23

Page 24: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Memory Allocation (1/2)Memory Allocation (1/2)APUE (Understanding of UNIX Processes)

#include <stdlib.h>void *malloc(size_t size);id * ll ( i bj i i )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

o d ee( o d pt );

Provide suitable alignment

• ex) doubles must start at the addresses that are multiples of 8.

UNIX System Programmingby Yang-Sae MoonPage 24

Page 25: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

Memory Allocation (2/2)Memory Allocation (2/2)APUE (Understanding of UNIX Processes)

malloc()

• allocates specified number of bytes (주어진 바이트 수를 할당) p y (주어진 바이트 수를 할당)

• 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 (기 할당된 메모리 영역에 추가 할당)• changes size of previously allocated memory (기 할당된 메모리 영역에 추가 할당)

• initial value of new area is indeterminate (새 영역의 초기 값은 결정되지 않음)

UNIX System Programmingby Yang-Sae MoonPage 25

Page 26: 13. APUE(The Environment of a UNIX Process)cs.kangwon.ac.kr/~ysmoon/courses/2010_2/us/13.pdf(TheEnvironmentofaUNIXProcess)(The Environment of a UNIX Process) 문양세 강원대학교강원대학교ITIT대학대학컴퓨터과학전공컴퓨터과학전공

예제예제: alloc.c: alloc.cAPUE (Understanding of UNIX Processes)

#include <stdio.h> // 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) {if((mbuf = (char *)realloc(mbuf, 24)) == (char *)0) {perror("realloc():"); exit(-1);

}strcat(mbuf, " National");

i f( % % \ b f b f)printf("%s%s\n", mbuf, cbuf);

free(mbuf);free(cbuf);

}

UNIX System Programmingby Yang-Sae MoonPage 26