lab 3. 프로세스 생성과 종료

15
OS Homework 1.1 운운운운 Lab 3. 프프프프 프프프 프프 1.(Unix/Linux) One, Two 운운운운 onetwo.c 운운 , 운운운 , 운운 2.(Unix/Linux) fork 운운 forkvalue.c 운운 , 운운운 , 운운 3.(Unix/Linux) 운운운 운운 execl() 운 운운운운 ls 운운운운운 운운운운운 forkexecl.c 운운 , 운운운 , 운운 4.(Unix/Linux) 운운운 운운 execv() 운 운운운운 ls 운운운운운 운운운운운 forkexecv.c 운운 , 운운운 , 운운 5.(Unix/Linux) Shell 운 운운운 background.c 운운 운운 , 운운운 , 운운 6.(Unix/Linux) mystatus.c & myexit.c 운운 운운 , 운운운 , 운운 7.(Windows) Win32 API 운 운운운 운 운운운운 운운 ( 운운 p108) 운운 , 운운운 , 운운 1~6 운운 운운 ( 운운운운 운운 운운운운운 ) » 2 Electronic versions: multi.incheon.ac.kr (117.16.244.53) 운 운운 운운운운 /export/home/os2011hwa 운운 os2011hwb 운 운운 운운운 운운운운 운운운 운 운운 운운운운운 운운운운 운운 mylinux.incheon.ac.kr (117.16.244.59) 운운 운운운운 /home/os2011hwa 운운 os2011hwb 운 운운 운운운 운운운운 운운운 운 운운 운운운운운 운운운운 운운

Upload: kenneth-mooney

Post on 02-Jan-2016

81 views

Category:

Documents


4 download

DESCRIPTION

Lab 3. 프로세스 생성과 종료. (Unix/Linux) One, Two 출력하는 onetwo.c 코딩 , 컴파일 , 실행 (Unix/Linux) fork 예제 forkvalue.c 코딩 , 컴파일 , 실행 (Unix/Linux) 시스템 호출 execl() 을 이용하여 ls 프로그램을 실행시키는 forkexecl.c 코딩 , 컴파일 , 실행 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lab 3.  프로세스 생성과 종료

OS Homework 1.1운영체제

Lab 3. 프로세스 생성과 종료

1. (Unix/Linux) One, Two 출력하는 onetwo.c 코딩 , 컴파일 , 실행

2. (Unix/Linux) fork 예제 forkvalue.c 코딩 , 컴파일 , 실행

3. (Unix/Linux) 시스템 호출 execl() 을 이용하여 ls 프로그램을 실행시키는 forkexecl.c 코딩 , 컴파일 , 실행

4. (Unix/Linux) 시스템 호출 execv() 를 이용하여 ls 프로그램을 실행시키는 forkexecv.c 코딩 , 컴파일 , 실행

5. (Unix/Linux) Shell 을 느끼는 background.c 코드 분석 , 컴파일 , 실행

6. (Unix/Linux) mystatus.c & myexit.c 코드 분석 , 컴파일 , 실행

7. (Windows) Win32 API 를 이용한 새 프로세스 생성 ( 교재 p108) 코딩 , 컴파일 , 실행

• 1~6 번만 제출 ( 집에서도 접속 가능합니다 )» 2 Electronic versions:

• multi.incheon.ac.kr (117.16.244.53) 의 지정 디렉토리 /export/home/os2011hwa 또는 os2011hwb 에 자기 학번의 디렉토리 만들고 그 곳에 소스파일과 실행파일 복사

• mylinux.incheon.ac.kr (117.16.244.59) 지정 디렉토리 /home/os2011hwa 또는 os2011hwb 에 자기 학번의 디렉토리 만들고 그 곳에 소스파일과 실행파일 복사

Page 2: Lab 3.  프로세스 생성과 종료

OS Homework 1.2운영체제

1. fork 시스템 호출

printf(“One\n”);

pid = fork();

printf(Two\n”);

printf(“One\n”);

pid=fork();

printf(“Two\n”);

printf(“One\n”);

pid = fork();

printf(“Two\n”);

PC

PC

PC

BEFORE

AFTERfork

B

A

A

#include <stdio.h>main(){int pid; printf("One\n"); pid = fork(); printf("Two\n");}

$ gcc onetwo.c –o onetwo

Page 3: Lab 3.  프로세스 생성과 종료

OS Homework 1.3운영체제

fork 와 exec 호출의 조합

PC

BA

A BEFORE FORK

AFTER FORK

wait((int*)0);

wait((int*)0);

pid = fork();

A

PC

PC

AFTER FORK

AFTER EXEC

execl(“/bin/ls” …);

/* first line of ls */

B (now runs ls)

PC

PC

Page 4: Lab 3.  프로세스 생성과 종료

OS Homework 1.4운영체제

2. fork() 로 새 프로세스를 생성하는 C program

#include <stdio.h>#include <stdlib.h>#include <unistd.h>

void main(int argc, char *argv[]){int pid; /* fork another process */ pid = fork(); if(pid < 0) { /* error occurred */ fprintf(stderr, “Fork Failed”); exit(-1); } else if (pid == 0) { /* child process */ execl(“/bin/ls”, “ls”, “-l”, NULL); } else { /* parent process */ wait(NULL); printf(“Child Complete\n”); exit(0); }}

• execv

char *av[3];

av[0]=“ls”;av[1]=“-l”;av[2]=(char *)0;

execv(“/bin/ls”, av);

• execlp, execvp쉘 환경변수 PATH 를 따름

execlp(“ls”, “ls”, “-l”, (char *)0);

execvp(“ls”, av);

Page 5: Lab 3.  프로세스 생성과 종료

OS Homework 1.5

4. fork() + exec() example: background.c

• 후면처리 (background processing)» 실행

$ gcc background.c –o background$ ./background ls -l

» 코드$ cat background.c#include <stdio.h>main (argc, argv)int argc;char* argv [];{ if (fork () == 0) /* Child */ { execvp (argv[1], &argv[1]); /* Execute other program */ fprintf (stderr, "Could not execute %s\n", argv[1]); }}

운영체제

Page 6: Lab 3.  프로세스 생성과 종료

OS Homework 1.6

5. exit example: mystatus.c & myexit.c

$ cat mystatus.c

#include <stdio.h>main (){ int pid, status, childPid; printf ("I'm the parent process and my PID is %d\n", getpid ()); pid = fork (); /* Duplicate */ if (pid != 0) /* Branch based on return value from fork () */ { printf ("I'm the parent process with PID %d and PPID %d\n", getpid (), getppid ()); childPid = wait (&status); /* Wait for a child to terminate. */ printf ("A child with PID %d, terminated with exit code low: %d,

high: %d\n“, childPid, (status & 0xFF), status >> 8); /* Linux */ } else { printf ("I'm the child process with PID %d and PPID %d\n", getpid (), getppid ());// execl ("/bin/ls", "ls", "-li", (char *)0); execl ("/export/home/mysung/osprog/myexit", "myexit", (char

*)0); exit (42); /* Exit with a silly number */ } printf ("PID %d terminates\n", getpid () );} 운영체제

$ cat myexit.c

#include <stdio.h>main (){ printf ("I'm going to exit with return

code 77\n"); exit (77);}

Page 7: Lab 3.  프로세스 생성과 종료

OS Homework 1.7

6. Win32 API 를 이용한 새 프로세스 생성

#include <windows.h>#include <stdio.h>int main( VOID ){ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line). "C:\\WINDOWS\\system32\\mspaint.exe", // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) CloseHandle( pi.hThread );; handles.FINITE );etLastError() );}

운영체제

Page 8: Lab 3.  프로세스 생성과 종료

OS Homework 1.8

• Command$ gcc myecho.c –o myecho$ ./myecho hello world!

• Outputhello world!

• argc 와 argv[]» argc=3» argv[0]: “echo”» argv[1]: “hello”» argv[2]: “world”

•Source code$ cat myecho.c#include <stdio.h>main(int argc, char *argv[]){

int i;for (i = 1; i < argc; i++)

printf(“%s%s”, argv[i], (i < argc-1) ? “ “ : “”);printf(“\n”);return 0;

}

(C 언어 보충 ) Command-line Arguments

argv:

myecho\0

hello\0

world\0

0

운영체제

Page 9: Lab 3.  프로세스 생성과 종료

OS Homework 1.9

(C 언어 보충 ) argv 처리 : optional flag

• myecho2.c ( 숫자 option 처리 )

$ cat myecho2.c#include <stdio.h>main(int argc, char *argv[]){ int i; for(i=1; i<argc; i++) { printf("%s%s", argv[i], (i<argc-1)? " “ : ""); if(argv[i][0] == '-') printf(“ ( 제곱값은 %d) ",

(atoi(argv[i]))*(atoi(argv[i]))); } printf("\n"); return 0;}

운영체제

Page 10: Lab 3.  프로세스 생성과 종료

OS Homework 1.10

(C 언어 보충 ) argv 처리 : optional flag

• myfind -n -x pattern$ cat myfind.c#include <stdio.h>#include <string.h>#define MAXLINE 1000int getline(char *line, int max);/*find : print lines that match pattern from 1st arg */main(int argc, char *argv[]){ char line[MAXLINE]; long lineno = 0; int c, except =0, number =0, found =0; while(--argc > 0 && (*++argv)[0] == '-') while(c = *++argv[0]) switch(c) { case 'x': except = 1; break; case 'n': number = 1; break; default: printf("find : illegal optin %c\

n",c); argc = 0; found = -1; break; }

if(argc != 1) printf("Usage : find -x -n patttern\n"); else while(getline(line, MAXLINE) > 0) { lineno++; if((strstr(line, *argv) != NULL ) != except) { if(number) printf("%ld:", lineno); printf("%s\n", line); found++; } } return found;}int getline(char s[], int lim){ int c, i; for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = '\0'; ++i; } s[i] = '\0'; return i;}

운영체제

Page 11: Lab 3.  프로세스 생성과 종료

OS Homework 1.11운영체제

Linux/Unix C 언어 프로그래밍

• cc compiler» man cc» $ cc –o hello hello.c» $ hello

•gcc compiler» GNU project C and C++ Compiler

• GNU(GNU’s Not Unix, Free Software Foundation 의 Richard Stallman)

» man gcc» info gcc» $ gcc hello.c» $ a.out» $ gcc –o hello hello.c» $ hello

Page 12: Lab 3.  프로세스 생성과 종료

OS Homework 1.12운영체제

유닉스 디버거 : gdb

• 프로그램을 기호적으로 디버깅 : dbx, adb, sdb, gdb, ddd(Motif) 등» 단일단계이동 (single stepping)» 정지점 (breakpoint)» 디버거 내에서 편집» 변수의 접근 및 수정» 함수의 탐색» 추적 (tracing)

• gdb» GNU debugger, 별도의 프롬프트 표시» 관련정보는 , 프롬프트에서 help 를 입력» dbx executableFilename

• 디버그를 위한 프로그램 준비» cc 의 -g 옵션으로 프로그램을 번역 » ⇒ 목적 모듈 내에 디버깅 정보 포함

Page 13: Lab 3.  프로세스 생성과 종료

OS Homework 1.13운영체제

유닉스 디버거 : gdb

• gdb 실행gdb 실행 파일이름 : 실행 파일을 디버그함 ( 실행 파일은 반드시 -g 옵션을 사용하여 컴파일되어야 함 )

• gdb 명령어 » b (breakpoint) : 실행 중 디버그를 위해 멈추는 위치 지정» b 함수명 : 함수명에서 멈춤» b 라인번호 : 라인번호에서 멈춤» r (run) : 실행 시작» n (next) : 현재 라인 실행 ( 함수의 경우 실행하고 다음 라인으로 넘어

감 )» s (step) : 현재 라인 실행 ( 함수의 경우 호출된 함수 내로 들어가 실행

계속 )» c (continue) : 다음 breakpoint 까지 실행» l (list) : 현재 수행되고 있는 라인부터 10 개 라인씩 연속적으로 소스

코드를 프린트» p (print) 변수명 : 변수명으로 저장되어 있는 내용을 프린트» h (help) : 도움말» q (quit) : gdb 종료

Page 14: Lab 3.  프로세스 생성과 종료

OS Homework 1.14운영체제

Vi 편집 모드

~~ Vi mode (Vi 명령 모드 )

~$$Vi filename

:q! ( 기록 않음 )

ZZ( 기록 ):wq

a iesc esc

x rdd 커서이동

append insert

oO

esc

open

Resc

replace

Page 15: Lab 3.  프로세스 생성과 종료

OS Homework 1.15운영체제

Vi 를 이용한 기본 텍스트 편집

• 커서의 이동» hjkl 이용

H J K L• [Vi mode] 4j

» G 명령으로 원하는 행으로 이동

• 7G• G : 마지막 행으로

» 화면 이동• F̂• ^B• ^D• ^U

• 텍스트 추가 , 삽입 , 수정a(append)i(insert)o(open)O(Open)R(Replace)

• 텍스트의 삭제 및 취소 (undo)x(exclude?)d(delete)

dwdbd$d^

r(replace)u(update)U(Update)

• 최근 명령 재 실행.

• 파일 관리» Vi 를 벗어나지 않고 저장하기 : :w» 저장 않고 끝내기 : :q!» 또 다른 파일 편집 : :e xx 또는 :e!

xx» 다른 파일을 읽어 와 덧붙이기 : :r xx

• http://marvel.inchon.ac.kr/ 의 Information 참조