슬라이드 1

Similar documents
<4D F736F F F696E74202D FC7C1B7CEBCBCBDBA20BBFDBCBAB0FA20BDC7C7E0205BC8A3C8AF20B8F0B5E55D>

2009년 상반기 사업계획

Microsoft PowerPoint - 10_Process

제9장 프로세스 제어

10.

6주차.key

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

ABC 11장

제1장 Unix란 무엇인가?

Microsoft PowerPoint - chap9 [호환 모드]

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

/chroot/lib/ /chroot/etc/

좀비프로세스 2

System Programming Lab

chap7.key

1장. 유닉스 시스템 프로그래밍 개요

슬라이드 1

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - ch09_파이프 [호환 모드]

2009년 상반기 사업계획

Microsoft PowerPoint - 09-Pipe

제8장 프로세스

제1장 Unix란 무엇인가?

제8장 프로세스

고급 프로그래밍 설계

<C1A63130C0E5C7C1B7CEBCBCBDBA2E687770>

리눅스 프로세스 관리

슬라이드 1

제12장 파일 입출력

歯9장.PDF

슬라이드 1

Chapter #01 Subject

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint 프레젠테이션

강의10

Microsoft PowerPoint - chap6 [호환 모드]

untitled

2009년 상반기 사업계획

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

2009년 상반기 사업계획

Microsoft PowerPoint APUE(Intro).ppt

vi 사용법

chap 5: Trees

chap12(process).hwp

The Pocket Guide to TCP/IP Sockets: C Version

untitled

금오공대 컴퓨터공학전공 강의자료

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Sena Technologies, Inc. HelloDevice Super 1.1.0

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint oshw1.ppt [호환 모드]

Chap04(Signals and Sessions).PDF

13주-14주proc.PDF

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

03장.스택.key

BMP 파일 처리

Microsoft PowerPoint oshw1&2.ppt [호환 모드]

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

untitled

Chap06(Interprocess Communication).PDF


PowerPoint Template

Microsoft PowerPoint - chap06-2pointer.ppt

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

금오공대 컴퓨터공학전공 강의자료

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 6 가지중하나. (1) 프로그램수행직후, (2) 5 초후 (3) 10 초후 (4) 15 #include <signa

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap12-고급기능.pptx

PowerPoint 프레젠테이션

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

untitled

Microsoft Word - Network Programming_NewVersion_01_.docx

슬라이드 1

Microsoft PowerPoint - chap2

The Pocket Guide to TCP/IP Sockets: C Version

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

Adobe Flash 취약점 분석 (CVE )

Microsoft PowerPoint - chap4 [호환 모드]

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

5.스택(강의자료).key

PowerPoint 프레젠테이션

컴파일러


Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - lab14.pptx

휠세미나3 ver0.4

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

untitled

Microsoft PowerPoint APUE(File InO).pptx

Transcription:

프로세스 (Process) (2) Chapter #9

강의목차 Process 관련시스템호출 Simple Shell Session Unix System Programming 2

프로세스정보 프로세스 ID 정보 프로세스정보 (1) PID(Process ID) 프로세스에할당되는유일한 ID( 정수값 ) PPID(Parent Process ID) 부모프로세스 ID PGID(Porcess Group ID) 하나의로긴쉘을부모프로세스로갖는프로세스그룹 ID 프로세스우선순위 (Process Priority) 실행가능한프로세스사이의스케줄링우선순위 0 : 제일높은우선순위 ~ 127: 제일낮은우선순위 프로세스우선순위변경 - nice 명령어 / nice() 시스템호출 프로세스의 cpu 사용시간 프로세스명령어실행시간 + 시스템실행시간 Unix System Programming 3

프로세스정보 (2) 프로세스정보 ( 계속 ) 사용자 ID 실사용자 (Real User) ID 프로세스를생성한사용자 ID / 프로세스를생성한쉘의사용자 ID fork() 시스템호출시에부모프로세스에서자신프로세스로계승 유효사용자 (Effective User) ID 그룹 ID 파일생성또는접근권한, 시스템콜실행권한등을검사할때에사용되는사용자 ID 보통실사용자 ID가유효사용자 ID가된다 접근모드중에 setuid가설정된프로그램의경우, 프로그램의소유자 ID가유효사용자 ID가된다 ( 예 ) /bin/passwd 실그룹 (Real Group) ID 유효그룹 (Effective Group) ID Unix System Programming 4

프로세스정보 (3) 프로세스정보 ( 계속 ) # ps el more Unix System Programming 5

프로세스정보 (4) 프로세스식별자 (Process ID) 관리 #include <sys/types.h> #include <unistd.h> pid_t getpid(void) pid_t getppid(void) pid_t getpgid(pid_t pid) pid_t getpgrp(void) // 현재프로세스의프로세스 ID 얻기 // 현재프로세스의부모프로세스 ID 얻기 // 현재프로세스의프로세스그룹 ID 얻기 // 현재프로세스의프로세스그룹 ID 얻기 /* 현재프로세스의프로세스 ID, 부모프로세스 ID 그리고프로세스그룹 ID 를반환한다 */ pid_t setpgid(pid_t pid, pid_t pgid) // 현재프로세스의프로세스그룹 ID 설정 pid_t setpgrp(void) // 현재프로세스의프로세스그룹 ID 설정 /* 정상종료되면 0 을반환하고, 에러인경우에는 -1 를반환한다. errno 에에러를나타내는값을설정한다. ( 참고 ) setpgrp = setpgid(0, 0) */ Unix System Programming 6

프로세스정보 (5) 프로세스의사용자식별자정보얻기 #include <sys/types.h> #include <unistd.h> uid_t getuid(void) gid_t getgid(void) uid_t geteuid(void) gid_t getegid(void) // 현재프로세스의실사용자 ID 얻기 // 현재프로세스의실그룹 ID 얻기 // 현재프로세스의유효사용자 ID 얻기 // 현재프로세스의유효그룹 ID 얻기 /* 에러가발생하지않으며, uid_t, gid_t 타입은 int 타입과같음 */ Unix System Programming 7

프로세스정보 (6) 프로세스의사용자식별자정보설정 #include <sys/types.h> #include <unistd.h> int setuid(uid_t uid) // 현재프로세스의실사용자 ID 설정 int setgid(gid_t gid) // 현재프로세스의실그룹 ID 설정 int seteuid(uid_t uid) // 현재프로세스의유효사용자 ID 설정 int setegid(gid_t gid) // 현재프로세스의유효그룹 ID 설정 int setreuid(uid_t ruid, uid_t euid) // 현재프로세스의실사용자및유효사용자 ID 설정 int setregid(gid_t rgid, gid_t egid) // 현재프로세스의실그룹및유효그룹 ID 설정 Unix System Programming 8

프로세스정보 (7) 아래의조건에따라읽기전용파일을생성하는프로그램을작성하고실사용자와유효사용자의관계를확인하라. 1. 실사용자와유효사용자의 ID를출력한다. 2. fopen() 함수를사용하여파일접근의성공과실패를검사한다. 3. setuid 함수를이용하여실사용자와유효사용자가동일하게만든다. 4. 1-2를반복한다. 실험은다음단계로한다. 1. 프로그램을실행하고출력을관측한다. 2. 그룹멤버가프로그램을수행할수있도록접근허가를수정하여그룹멤버로하여금프로그램을수행시킨다. 3. set-user-id 비트를설정하고그룹멤버로하여금프로그램을수행시킨다. Unix System Programming 9

#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp ; char line[256]; int uid; 프로세스정보 (8) if(argc <2) { fprintf(stderr,"usage: %s file_name\n",argv[0]); exit(1); printf("initially uid=%d and euid%d\n",getuid(), geteuid()); fp = fopen(argv[1],"r"); if(fp = NULL) { fprintf(stderr,"first open of %s failed",argv[1]); exit(2); else { printf("first open successful:\n"); while(fgets(fp,line,255)!=null) fputs(stdout,line); fclose(fp); Unix System Programming 10

프로세스정보 (9) setuid(uid = getuid()); printf("after setuid(%d):\n uid=%d and euid=%d\n",uid, getuid(), geteuid()); fp = fopen(argv[1], "r"); if(fp == NULL) { fprintf(stderr,"second open of %s failed",argv[1]); exit(3); else { printf("second open successful:\n"); while(fgets(line,255,fp)!= NULL) fputs(line,stdout); fclose(fp); return 0; Unix System Programming 11

프로세스정보 (10) 아래주어진옵션 (option) 에따라프로세스의정보를출력하는프로그램을작성하라. 옵션 (option) 의분해에는 getopt함수를사용한다. -i : 사용자 (user) 와그룹 (group) 의실사용자및유효사용자 ID를다음의함수를사용하여출력한다. -s : setpgrp() 함수를이용하여프로세스를새로운그룹에포함시킨다 -p : 프로세스, 부모프로세스, 그룹프로세스 ID를다음함수를이용하여출력한다. Unix System Programming 12

프로세스정보 (11) -p : 프로세스, 부모프로세스, 그룹프로세스 ID 를다음함수를이용하여출력한다. -u : ulimit() 함수를호출하여프로세스의크기에대한값을출력한다. -Unewlimit: ulimit() 함수를이용하여프로세스크기에대한값을새로설정한다. Unix System Programming 13

프로세스정보 (12) #include <stdio.h> #define GET_FSLIM1 #define SET_FSLIM2 extern char *optarg; extern int optind; int main(int argc, char *argv[]) { int getopt(), c; long ulimit(), atol(); static char options[] = "ispuu:"; if(argc < 2) fprintf(stderr,"usage: %s [-i] [-s] [-p] [-u] [-Unewulimit]\n", argv[0]); while((c=getopt(argc,argv,options))!= EOF) switch(c) { case 'i': printf("real userid = %d\n",getuid()); printf("effective userid = %d\n",geteuid()); printf("real groupid = %d\n",getgid()); printf("effective groupid = %d\n",getegid()); break; Unix System Programming 14

프로세스정보 (13) ulimit\n"); case 's': (void) setpgrp(); break; case 'p': printf("process number = %d\n",getpid()); printf("parent process number = %d\n",getppid()); printf("group process number = %d\n",getpgrp()); case 'U': if(ulimit(set_fslim,atol(optarg)) == -1) fprintf(stderr,"must be super-user to increase break; case 'u': printf("ulimit = %ld\n",ulimit(get_fslim,0l)); break; return 0; Unix System Programming 15

프로세스정보 (14) 프로세스의우선순위변경 #include <sys/types.h> #include <unistd.h> int nice(int inc) // 현재프로세스의우선순위변경 /* int inc : 우선순위를나타내는정수값 */ /* 정상종료되면 0 을반환하고, 에러인경우에는 -1 를반환한다. errno 에에러를나타내는값을설정한다. */ nice 시스템콜을호출한프로세스의 nice 값에 inc 값을더하여우선순위를변경한다 inc에음수를지정하여우선순위를높일수있으나, 슈퍼유저만가능함 Unix System Programming 16

프로세스정보 (15) 프로세스의 CPU 사용시간정보 #include <sys/types.h> #include <unistd.h> clock_t times(struct tms *buf) /* struct tms *buf : 프로세스소비시간정보 */ /* 정상종료되면 0 을반환하고, 에러인경우에는 -1 를반환한다. errno 에에러를나타내는값을설정한다. */ tms 구조체에는다음의정보를정의한다 사용자시간 : 프로세스가명령어실행에사용한 CPU 시간 시스템시간 : 프로세스를위해시스템이사용한 CPU 시간 자식프로세스의사용자시간 : 끝나기를기다리는모드자식프로세스의사용자시간의합계 자식프로세스의시스템시간 : 끝나기를기다리는모드자식프로세스의시스템시간의합계 Unix System Programming 17

프로세스환경변수 프로세스정보 (16) LINUX 프로세스의환경은셸 (shell) 변수들로써이루어짐 셸 (shell) 변수들은스택 (stack) 에저장되어있음 환경변수접근방법 방법 #1 - 명령어행의인수 (argument) 들을접근하는것처럼주함수 (main function) 에환경변수파라미터를추가하는것 방법 #2 - 환경변수들이저장된테이블의시작주소를가지고있는전역변수 envion 을이용 Unix System Programming 18

프로세스정보 (17) 프로세스의환경변수 : getenv, putenv Unix System Programming 19

프로세스정보 (18) 자신의환경변수들을모두출력하는프로그램을작성하라. 환경변수 TZ(Time Zone) 을변경한후변경된내용을출력하여확인하라. 새로운환경변수 WARNING에값을설정한후그내용을출력시켜라. Unix System Programming 20

프로세스정보 (19) extern char **environ; void main(int argc, char *argv[], char *envp[]) { char *getenv(); printenv("initially", &envp); putenv("tz=pst8pdt"); printenv("after changing TZ", &envp); putenv("warning=don't use envp after putenv()"); printenv("after setting a new variable",&envp); printf("value of WARNING is %s\n",getenv("warning")); Unix System Programming 21

프로세스정보 (20) void printenv(char *label, char ***envpp) { char **p; printf("---- %s ---\n",label); printf(" envp is at %8o and contains %8o\n", envpp, *envpp); printf("environ is at %8o and contains %8o\n", &environ, environ); printf("my environment variables are:\n"); for(p=environ; *p; p++) printf("(%8o) = %8o -> %s\n",p,*p,*p); printf("(%8o) = %8o\n", p, *p); Unix System Programming 22

프로세스생성 : fork() #include <sys/types.h> #include <unistd.h> pid_t fork(void) 프로세스생성 (1) /* 정상종료되면자식프로세스에게는 0 을반환하고부모프로세스에게는자식프로세스의프로세스 ID 를반환한다. 그리고에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 호출한프로세스의구조를동일하게복사한프로세스를생성 부모프로세스 (parent process) 와자식프로세스 (child process) 복제된자식프로세스는부모프로세스로부터텍스트 ( 코드 ), 데이터그리고파일디스크립터등모든정보나속성을상속받는다 자식프로세스의 CPU 사용시간정보는 0으로초기화된다 Unix System Programming 23

프로세스생성 (2) the child process inherit the following from the parent differences between the parent and child real-uid(gid), effectiveuid(gid), supplementary gid process group id, session id, controlling terminal set-user(group)-id flag current working directory, root directory, umask signal mask and dispositions the return value from fork PID and PPID child s resource utilizations are set to 0 pending alarms are cleared for the child the set of pending signals for the child is set to the empty set close-on-exec flags Environment resource limits Unix System Programming 24

프로세스생성 (3) 커널의 fork() 시스템콜수행절차 1. 새로운프로세스를위해프로세스테이블항을할당한다. 2. 자식프로세스에게고유의 ID 번호를부여한다. 3. 부모프로세스의내용을논리적으로복사한다. 예를들면, 텍스트영역과같은프로세스의일부영역은프로세스사이에공유될수있으므로, 커널은그영역을메모리내의새로운위치에복사하는대신영역참조계수 (region reference count) 를증가시킬수도있다. 4. 프로세스와관련된파일에대해파일테이블과 inode 테이블카운터 (counter) 를증가시킨다. 5. 부모프로세스에게는자식의 ID 번호를복귀시키고, 자식프로세스에게는 0 을복귀시킨다. Unix System Programming 25

프로세스생성 (4) fork() 시스템콜수행결과 unix System Programming 26

프로세스생성 (5) fork() 시스템콜수행결과 unix System Programming 27

프로세스생성 (6) fork() 시스템콜수행결과 unix System Programming 28

프로세스생성 (7) fork() 시스템콜에따른부모및자식프로세스구분 int pid; : if ((pid = for()) == 0) { // return 0 to child process // child process s processing else if (pid > 0) { // return process ID of child process to parent process // parent process s processing Else { perror( fork ); exit 1; Unix System Programming 29

프로세스생성 (8) UNIX 프로세스생성방법 : fork & exec 교재 pp.277 그림 9.2 참조 Unix System Programming 30

예제프로그램 #1 프로세스생성 (9) fork() 시스템콜전에부모프로세스의 ID를출력하고, fork() 시스템콜후에부모및자식프로세스의 ID를출력하여 fork 함수의기능을확인할수있는프로그램을작성한다 현재수행중인프로세스의 ID는 getpid() 함수를사용하고, 현재프로세스의부모프로세스 ID는 getppid() 함수를사용하여얻는다 Unix System Programming 31

프로세스생성 (10) #include <stdio.h> int main(void) { int getpid(), getppid(); printf("[%d] parent process id: %d\n",getpid(), getppid()); fork(); printf("\n\t[%d] parent process id: %d\n",getpid(), getppid()); printf("this IS FORK SYSTEM CALL TEST.\n"); return 0; Unix System Programming 32

예제프로그램 #2 프로세스생성 (11) 부모프로세스는대문자로 A 에서 Z 까지출력하고동시에자식프로세스는소문자로 a 에서 z 까지출력하는프로그램을작성하여두개의프로세스가동시에수행되고있음을확인하여라. Unix System Programming 33

#include <sys/types.h> #include <unistd.h> main(int argc, char *argv[]) { char ch, first, last; int pid; long i; 프로세스생성 (12) if((pid = fork())>0) { /* parent */ first = 'A'; last = 'Z'; else if(pid == 0) { /* child */ first = 'a'; last = 'z'; else { /* not fork(2) */ perror(argv[0]); exit(1); printf("\n"); for(ch = first; ch <= last; ch++) { /* delay loop */ for(i=0; i<= 100000; i++); write(1, &ch, 1); return 0; Unix System Programming 34

예제프로그램 #3 프로세스생성 (13) fork() 시스템콜에의한상속 부모프로세스가가지고있던변수값들은자식프로세스에복제되어그대로전달 부모프로세스의파일디스크립터테이블이자식프로세스에그대로전달 부모프로세스와자식프로세스사이의파일디스크립터상속및파일공유를테스트하는프로그램 Unix System Programming 35

프로세스생성 (14) /*proc_file -- fork 시파일이어떻게취급되는지를보인다. */ /*fork 는 data 가최소한 20 문자이상임을가정한다. */ #include <unistd.h> #include <fcntl.h> int main(void) { intfd; pid_tpid;/* 프로세스식별번호 */ char buf[10];/* 화일자료를저장할버퍼 */ if (( fd= open ("data", O_RDONLY)) == -1) fatal ("open failed"); read (fd, buf, 10); /* 파일포인터를전진시킨다. */ printpos("before fork", fd); /* 이제두개의프로세스를생성한다. */ switch (pid= fork()){ case -1: /* 오류 */ fatal ("fork failed"); break; 36

프로세스생성 (15) case 0: /* 자식 */ printpos("child before read", fd); read (fd, buf, 10); printpos("child after read", fd); break; default: /* 부모 */ wait ((int*)0); printpos("parent after wait", fd); exit(0); /* 파일내에서위치를프린트한다. */ void intprintpos(constchar *string, intfiledes) { off_t pos: if (( pos = lseek(filedes, 0, SEEK_CUR)) == -1) fatal ("lseekfailed"); printf("%s:%ld\n", string, pos); 37

프로세스생성 (16) fork 부모프로세스의메모리영역복사 부모프로세스의정보 (file descriptor, signal 등복사 ) vfork 부모프로세스의메모리영역공유 자식프로세스는 exec 이나 exit 호출을할때까지부모프로세스의메모리영역에서실행되며, 부모프로세스는실행을멈춘다. 자식프로세스에서의변경이부모프로세스에게영향을준다. 자식프로세스는 _exit 호출로종료해야한다. (exit는표준입출력을 flush, close한다 ) 보통 execve() 와함께사용 Clone Linux에서의 thread 생성 4 개의인자사용 fn: 새로생성된태스크에서수행할함수, arg: fn에게전달할함수 flags: CLONE_VM, CLONE_FILES, CLONE_PTRACE, CLONE_VFORK child stack: 새로생성된태스크에서사용할사용자수준스택 38

프로세스실행 : exec() 프로세스실행 (1) 호출한프로세스를다른프로그램을실행하는새로운프로세스로변환한다 3 가지인자 : 새롭게실행하는프로그램의파일경로명 새롭게실행하는프로그램의 main() 함수에전달하는명령어행의파라미터정보 (argv 정보 ) 새롭게실행하는프로그램의 main() 함수에전달하는환경변수정보 (envp 정보 ) 인자전달방식에따라 6 종류의시스템콜을지원 execl(), execv(), execl(), execve(), execlp(), execvp() 39

프로세스실행 : exec() 프로세스실행 (2) Unix System Programming 40

프로세스실행 : exec() #include <sys/types.h> #include <unistd.h> 프로세스실행 (3) int execl(const char *path, const char *argv0, *argv1,, *argvn, (char *)0) int execv(const char *path, char *const argv[]) /* const char *path : 실행파일의경로명 */ /* const char *argv0, *argv1,, *argvn : argv 정보목록 */ /* char *const argv[] : argv 정보 ( 문자열배열 ) */ /* 에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 첫번째인자인경로명에서지정한실행파일을실행한다 Unix System Programming 41

프로세스실행 : exec() #include <sys/types.h> #include <unistd.h> 프로세스실행 (4) int execle(const char *path, const char *argv0, *argv1,, *argvn, (char *)0, char *const envp[]) int execve(const char *path, char *const argv[], char *const envp[]) /* const char *path : 실행파일의경로명 */ /* const char *argv0, *argv1,, *argvn : argv 정보목록 */ /* char *const argv[] : argv 정보 ( 문자열배열 ) */ /* char *const envp[]: envp 정보 ( 문자열배열 ) */ /* 에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 환경변수정보를마지막인자로전달한다 Unix System Programming 42

프로세스실행 : exec() #include <sys/types.h> #include <unistd.h> 프로세스실행 (5) int execlp(const char *file, const char *argv0, *argv1,, *argvn, (char *)0) int execvp(const char *file, char *const argv[]) /* const char *file : 실행파일명 */ /* const char *argv0, *argv1,, *argvn : argv 정보목록 */ /* char *const argv[] : argv 정보 ( 문자열배열 ) */ /* 에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 첫번째인자로파일명만주어지며, 환경변수 PATH 에서지정된디렉토리안에서찾아실행한다 Unix System Programming 43

예제프로그램 #1 프로세스실행 (6) 명령어행의파라미터에서지정한프로그램을실행하는프로그램 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #define ERR -1 void usage(const char* fname) { char *cmd_name; if ((cmd_name = rindex(fname, / ))!= NULL) cmd_name++; else cmd_name = fname; fprintf(stderr, Usage: %s command [option]\n, cmd_name); exit(1); Unix System Programming 44

프로세스실행 (7) int main(int argc, char *argv[]) { if (argv < 2) Usage(argv[0]); if(execv(argv[1], &argv[1]) == ERR) { perror( execv ); exit(1); // doesn t reach here return 0; Unix System Programming 45

예제프로그램 #2 프로세스실행 (8) exec 시스템호출함수를이용하여다른프로그램을실행시키면본래의프로그램은실행이중단되는결과를가져온다. 그러므로프로그램에서 exec 함수를이용하여다른프로그램을수행시킨후중단없이작업을계속하려면 fork 를이용하여자식프로세스가 exec 함수를호출하게만들면부모프로세스의중단없이작업을계속수행할수있다 fork 와 exec 함수를이용하여부모프로세스가중단되지않도록 exec 함수를사용하여 LINUX 의 echo 명령어를실행시키는프로그램을작성하여라 Unix System Programming 46

프로세스실행 (9) int main(void) { int fork(); if(fork() == 0) { execl("/bin/echo", "echo","this is","message one",(char *) 0); perror("exec one failed"); exit(1); if(fork() == 0) { execl("/bin/echo","echo","this is","message two",(char *) 0); perror("exec two failed"); exit(2); if(fork() == 0) { execl("/bin/echo","echo","this is","message three",(char *) 0); perror("exec three failed"); exit(3); printf("parent program ending\n"); return 0; Unix System Programming 47

자식프로세스종료대기 (1) 자식프로세스종료대기 : wait() #include <sys/types.h> #include <sys/wait.h> pid_twait(int*status) /* int *status : 자식프로세스의종료상태정보 */ /* 자식프로세스가종료나정지한경우에자식프로세스의프로세스 ID 를반환한다. 시그널을수신하여복귀한경우에는외부변수 errno 에 EINTR 를설정한다. 에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 호출프로세스는자식프로세스가종료되거나정지되기를기다린다 자식프로세스중에하나가종료되거나정지되면자식프로세스의 PID 값이반환하며, 자식프로세스의종료상태값을전달인자 status( 하위 16 비트 ) 에저장하여반환한다 48

자식프로세스종료대기 (2) 자식프로세스의종료또는정지상태정보구분 자식프로세스가 exit() 시스템콜의호출에의해종료한경우 15 8 7 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 exit() 로전달된값의하위 8 비트값하위 8 비트 = 0 자식프로세스가시그널에의해종료한경우 15 8 7 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 상위 8 비트 = 0 하위 8 비트 = 시그널번호 자식프로세스가정지한경우 15 8 7 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 정지한원인이되는시그널번호 하위 8 비트 = 0x7f 49

자식프로세스종료대기 (3) 자식프로세스종료대기 : waitpid() #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options) /* pid_t pid : 자식프로세스의프로세스 ID */ /* int *status : 자식프로세스의종료상태정보 */ /* int options : 동작에관한옵션 */ /* 자식프로세스가종료나정지한경우에자식프로세스의프로세스 ID 를반환한다. 시그널을수신하여복귀한경우에는외부변수 errno 에 EINTR 를설정한다. 에러인경우에는 -1 를반환하고 errno 에에러를나타내는값을설정한다. */ 종료나정지하는자식프로세스의프로세스 ID 또는프로세스그룹 ID 를지정할수있다 50

자식프로세스종료대기 (4) 자식프로세스종료대기 : waitpid() 자식프로세스지정 pid 값 지정하는자식프로세스 -1 보다작은값 pid 의절대값과같은프로세스그룹 ID 를가진프로세스 -1 자식프로세스중에임의의자식프로세스. wait() 와동일 0 waitpid() 를호출한프로세스의프로세스그룹 ID 와같은프로세스그룹 ID 를가지프로세스 0 보다큰값프로세스 ID 가 pid 와같은프로세스 option 인자 WNOHANG 대기할자식프로세스가없는경우에바로반환한다 WUNTRACED 자식프로세스가정지하고있는경우에도반환하며, status 는보고되지않는다 51

프로세스종료 : _exit() #include <unistd.h> void _exit(int status) /* intstatus : 종료상태정보 */ 프로세스종료 (1) 호출프로세스를종료하며, status 인자값이종료상태정보로전달된다 프로세스종료시에열어둔모드파일디스크립터를닫는다 52

프로세스종료 : exit() #include <stdlib.h> void exit(int status) /* intstatus : 종료상태정보 */ 프로세스종료 (2) 호출프로세스를종료하며, status 인자값이종료상태정보로전달된다 ( 라이브러리함수 ) _exit() 기능이외에종료시에지정된처리나입출력버퍼를비우는기능을수행한다 53

Zombie 프로세스 (1) Normal parent-child process relation A parent process waits for a child process to exit. Other situations A child process exits when its parent process is not currently executing wait. The child is zombie-a process without any kernel resources. The child will be removed if the parent executes wait. A parent exits while one or more children are still running. The parent can exit normally. The children are adopted by the init process(pid=1). Unix System Programming 54

zombie state Zombie 프로세스 (2) the kernel has to keep a certain amount of information consists of PID, the termination status of the process, and the amount of CPU time taken by the process the process that has terminated, but whose parent has not yet waited for it, is called a zombie init is written so that whenever one of its children terminates,init calls one of the wait functions to fetch the termination status init prevents the system from being clogged by zombies Unix System Programming 55

프로세스관련예제 #1 (1) 프로세스관련예제 #1 명령어행의파라미터에서지정한프로그램을자식프로세스를통해실행하고자식프로세스의종료상태정보를같이출력하는프로그램 쉘의명령어실행기능 (foreground command execution) Unix System Programming 56

프로세스관련예제 #1 (2) #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #define ERR -1 void usage(const char* fname) { char *cmd_name; if ((cmd_name = rindex(fname, / ))!= NULL) cmd_name++; else cmd_name = fname; fprintf(stderr, Usage: %s command [option]\n, cmd_name); exit(1); int main(int argc, char *argv[]) { int pid, status; if(argc < 2) usage(argv[0]); Unix System Programming 57

프로세스관련예제 #1 (3) if ((pid = fork()) == 0) { printf( Child process : execute a new program %s.\n, argv[1]); if (execv(argv[1], &argv[1] == ERR) { perror( execv ); exit(1); else if (pid > 0) { wait(&status); printf( Parent process : child process just finished.\n ); printf( status = 0x%04x\n, status); else { perror( fork ); exit(1); exit(0); Unix System Programming 58

프로세스관련예제 #2 프로세스관련예제 #2 동시에여러개의자식프로세스를생성하고, 자식프로세스로하여금다른프로그램을실행하도록한후에모든자식프로세스가종료할때까지대기하는프로그램 프로그램소스 교재 pp. 286 ~293 참조 Unix System Programming 59

쉘프로그램의기본구조 Shell 구현 (1) Unix System Programming 60

Shell 구현 (2) /* main.c: simple shell example. */ main(){... char prompt[] = "mysh> "; // 전처리 : 쉘설명출력 while (1) { // 쉘프롬프트출력. 그리고표준입력에서명령어라인읽기 if (read(0, command, DO_MAX_BUF) == 0) { printf("havea nice day^^ n"); exit(0); // 명령을 token 별로구분 while (1) { getnexttoken(&command[cmd_offset], argv[cur_argc]); cur_argc++;... // token 이내부명령일경우처리 if (strcmp(argv[0], "exit") == 0) { printf("havea nice day^^ n"); exit(0); // token 에서파이프, 입출력재지정, 백그라운드, 다중명령처리 // 쉘스크립트처리 // 외부명령처리 do_command(argv); Unix System Programming 61

Simple Shell (1) simple command processor 프로세스관련시스템호출을활용 표준 UNIX 명령및유틸리티와유사한형태 구조 while (!EOF) { 사용자로부터명령줄을받아들인다명령인수를조립하여수행한다자식을기다린다 (wait) Unix System Programming 62

Simple Shell 구현 교재 pp. 294~301 참조 Simple Shell (2) Unix System Programming 63

Session Session (1) a collection of one or more process group 각프로세스그룹은하나의세션에소속 각세션은하나의제어단말기 (controlling terminal) 을가짐 한세션은하나의 foreground process group과하나또는그이상의 background process group으로구성 daemon process에사용 controlling terminal을갖지않는프로세스 setsid() 를사용하여생성 Unix System Programming 64

Session Session (2) a process(not a process group leader) can create a new session by calling setsid( ) #include <unistd.h> pid_t setsid(void); The calling process is the leader of the new session. The calling process is the process group leader of the new process group. has no controlling terminal The process group ID and session ID of the calling process are set to the PID of the calling process Unix System Programming 65

Session (3) Session The calling process will be the only process in this new process group and in this new session A process group leader is a process with process group ID equal to its PID In order to be sure that setsidwill succeed, fork and exit, and have the child do setsid() return value the session ID of the calling process on success -1 on error Unix System Programming 66

Session (4) Process Group & Session Unix System Programming 67