lab 3. 프로세스 생성과 종료
DESCRIPTION
Lab 3. 프로세스 생성과 종료. (Unix/Linux) One, Two 출력하는 onetwo.c 코딩 , 컴파일 , 실행 (Unix/Linux) fork 예제 forkvalue.c 코딩 , 컴파일 , 실행 (Unix/Linux) 시스템 호출 execl() 을 이용하여 ls 프로그램을 실행시키는 forkexecl.c 코딩 , 컴파일 , 실행 - PowerPoint PPT PresentationTRANSCRIPT
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 에 자기 학번의 디렉토리 만들고 그 곳에 소스파일과 실행파일 복사
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
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
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);
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]); }}
운영체제
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);}
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() );}
운영체제
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
운영체제
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;}
운영체제
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;}
운영체제
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
OS Homework 1.12운영체제
유닉스 디버거 : gdb
• 프로그램을 기호적으로 디버깅 : dbx, adb, sdb, gdb, ddd(Motif) 등» 단일단계이동 (single stepping)» 정지점 (breakpoint)» 디버거 내에서 편집» 변수의 접근 및 수정» 함수의 탐색» 추적 (tracing)
• gdb» GNU debugger, 별도의 프롬프트 표시» 관련정보는 , 프롬프트에서 help 를 입력» dbx executableFilename
• 디버그를 위한 프로그램 준비» cc 의 -g 옵션으로 프로그램을 번역 » ⇒ 목적 모듈 내에 디버깅 정보 포함
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 종료
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
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 참조