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특성화대학특성화대학 컴퓨터과학전공컴퓨터과학전공
강의강의 내용내용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
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
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
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
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
_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
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
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
예제예제: 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
예제예제: exit handlers (2/2): exit handlers (2/2)APUE (Understanding of UNIX Processes)
실행 결과
UNIX System Programmingby Yang-Sae MoonPage 11
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
예제예제: 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
Environment Variables (1/2)Environment Variables (1/2)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
Environment Variables (2/2)Environment Variables (2/2)APUE (Understanding of UNIX Processes)
UNIX System Programmingby Yang-Sae MoonPage 15
Environment List (1/2)Environment List (1/2)APUE (Understanding of UNIX Processes)
전역 변수 environ을 이용하여 환경 변수에 접근한다.
extern char ** environ;
각 항목은 "환경 변수 이름=값" 의 형식을 가진다.
• 각 문자열은 '\0'로 끝난다• 각 문자열은 \0로 끝난다.
• 환경 변수 리스트의 마지막은 NULL 포인터
argv 와 같은 구조이다.
UNIX System Programmingby Yang-Sae MoonPage 16
Environment List (2/2)Environment List (2/2)APUE (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
getenv()getenv()APUE (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
putenv()putenv()APUE (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
setenv(), unsetenv()setenv(), unsetenv()APUE (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
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…
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
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
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
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
예제예제: 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