1 / 15

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lab3. 프로세스생성과 종료 • (Unix/Linux) One, Two 출력하는 onetwo.c 코딩, 컴파일, 실행 • (Unix/Linux) fork 예제 forkvalue.c 코딩, 컴파일, 실행 • (Unix/Linux) 시스템 호출 execl()을 이용하여 ls 프로그램을 실행시키는 forkexecl.c 코딩, 컴파일, 실행 • (Unix/Linux) 시스템 호출 execv()를 이용하여 ls 프로그램을 실행시키는 forkexecv.c 코딩, 컴파일, 실행 • (Unix/Linux) Shell을 느끼는 background.c 코드 분석, 컴파일, 실행 • (Unix/Linux) mystatus.c & myexit.c 코드 분석, 컴파일, 실행 • (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 에 자기 학번의디렉토리 만들고 그 곳에 소스파일과 실행파일 복사 운영체제

  2. PC PC PC 1. fork 시스템 호출 #include <stdio.h> main() { int pid; printf("One\n"); pid = fork(); printf("Two\n"); } $ gcc onetwo.c –o onetwo BEFORE A fork AFTER A B 운영체제

  3. PC PC PC PC PC fork와 exec호출의 조합 A BEFORE FORK AFTER FORK A B AFTER FORK AFTER EXEC A B (now runs ls) 운영체제

  4. 2. fork()로 새 프로세스를 생성하는 Cprogram • 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); #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); } } 운영체제

  5. 4. fork() + exec() example: background.c • 후면처리 (backgroundprocessing) • 실행 $ 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]); } } 운영체제

  6. 5. exit example: mystatus.c & myexit.c $ cat myexit.c #include <stdio.h> main () { printf ("I'm going to exit with return code 77\n"); exit (77); } $ 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 () ); } 운영체제

  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() ); } 운영체제

  8. (C언어 보충) Command-line Arguments • Command $ gcc myecho.c –o myecho $ ./myecho hello world! • Output hello 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; } argv: myecho\0 hello\0 world\0 0 운영체제

  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; } 운영체제

  10. (C언어 보충) argv 처리: optional flag • myfind-n -x pattern $ cat myfind.c #include <stdio.h> #include <string.h> #define MAXLINE 1000 int 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; } 운영체제

  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 운영체제

  12. 유닉스 디버거 : gdb • 프로그램을 기호적으로 디버깅 : dbx, adb, sdb, gdb, ddd(Motif) 등 • 단일단계이동(single stepping) • 정지점(breakpoint) • 디버거 내에서 편집 • 변수의 접근 및 수정 • 함수의 탐색 • 추적(tracing) • gdb • GNU debugger, 별도의 프롬프트 표시 • 관련정보는, 프롬프트에서 help를 입력 • dbx executableFilename • 디버그를 위한 프로그램 준비 • cc의 -g 옵션으로 프로그램을 번역 • ⇒ 목적 모듈 내에 디버깅 정보 포함 운영체제

  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 종료  운영체제

  14. replace append insert open esc esc esc esc a i R oO $Vi filename ~ ~ Vi mode (Vi 명령 모드) ~ $ :q! (기록 않음) ZZ(기록) :wq x dd r 커서이동 Vi 편집 모드 운영체제

  15. 커서의 이동 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) dw db d$ d^ r(replace) u(update) U(Update) 최근 명령 재 실행 . 파일 관리 Vi를 벗어나지 않고 저장하기: :w 저장 않고 끝내기: :q! 또 다른 파일 편집: :e xx 또는 :e! xx 다른 파일을 읽어 와 덧붙이기: :r xx http://marvel.inchon.ac.kr/ 의 Information 참조 Vi를 이용한 기본 텍스트 편집 운영체제

More Related