fork로 생성한 자식 프로세스에서 exec 함수군을 호출

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

제6장 조건문.
Linux System Programming
6 레이스 컨디션.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Linux/UNIX Programming APUE (Process Control)
Linux System Programming
Department of Computer Engineering
9 파이프.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Signal & Inter-Process Communication
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
Department of Computer Engineering
제5장 제어명령
처음으로 배우는 C 프로그래밍 제2부 기초 제5장 반복문.
6 프로세스 생성과 실행.
6 프로세스 생성과 실행.
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
제 12장 I/O멀티플렉싱(Multiplexing)
7. while 문의 흐름 제어.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
Using Standard I/O on Sockets
Department of Computer Engineering
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Department of Computer Engineering
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
Linux System Programming
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
Signal & Inter-Process Communication
Term Project Team Member
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
Chapter 06. 선택문.
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
8 메모리 매핑.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
(ioctl, mmap, fsync&flush)
6장 파일 및 레코드 잠금.
Department of Computer Engineering
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
5 프로세스 정보.
4장 제어문 선택문: if 문, if – else 문, switch 문
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
Signal & Inter-Process Communication
13장 프로세스 사이의 통신.
TCP / IP 소켓 프로그래밍 3주차 ( Ch.10 ~ Ch.14 ).
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
U N I X 창원대학교 전자계산학과 김병찬.
Signal & Inter-Process Communication
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
Department of Computer Engineering
제 16장 입력과 출력 스트림의 완벽 분리 TCP/IP Socket Programming… 데이터베이스 실험실
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 08. 조건에 따른 흐름의 분기.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
9 파이프.
어서와 C언어는 처음이지 제16장.
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
Signal & Inter-Process Communication
Presentation transcript:

fork로 생성한 자식 프로세스에서 exec 함수군을 호출 exec 함수군과 fork 함수 fork로 생성한 자식 프로세스에서 exec 함수군을 호출 자식 프로세스의 메모리 이미지가 부모 프로세스 이미지에서 exec 함수로 호출한 새로운 명령으로 대체 자식 프로세스는 부모 프로세스와 다른 프로그램 실행 가능 부모 프로세스와 자식 프로세스가 각기 다른 작업을 수행해야 할 때 fork와 exec 함수를 함께 사용

[예제 6-7] fork와 exec 함수 사용하기 (test1.c) ... 06 int main(void) { 07 pid_t pid; 08 09 switch (pid = fork()) { 10 case -1 : /* fork failed */ 11 perror("fork"); 12 exit(1); 13 break; 14 case 0 : /* child process */ 15 printf("--> Child Process\n"); 16 if (execlp("ls", "ls", "-a", (char *)NULL) == -1) { 17 perror("execlp"); 18 exit(1); } 20 exit(0); 21 break; 22 default : /* parent process */ 23 printf("--> Parent process - My PID:%d\n“,(int)getpid()); 24 break; 27 return 0; 28 } 자식프로세스에서 execlp 함수 실행 부모프로세스는 이 부분 실행 # ex6_7.out --> Child Process ex6_1.c ex6_3.c ex6_5.c ex6_6_arg.c ex6_7.out ex6_2.c ex6_4.c ex6_6.c ex6_7.c han.txt --> Parent process - My PID:10535

프로세스 동기화 부모 프로세스와 자식 프로세스의 파일 공유 test2.c

프로세스 동기화 부모 프로세스와 자식 프로세스의 종료절차 좀비프로세스 고아프로세스 부모 프로세스와 자식 프로세스는 순서와 상관없이 실행하고 먼저 실행을 마친 프로세스는 종료 부모 프로세스와 자식 프로세스 사이에 종료절차가 제대로 진행되지 않으면 좀비 프로세스 발생 좀비프로세스 실행을 종료하고 자원을 반납한 자식 프로세스의 종료 상태를 부모 프로세스가 가져가지 않으면 좀비 프로세스 발생 좀비 프로세스는 프로세스 테이블에만 존재 좀비 프로세스는 일반적인 제거 방법은 없음 좀비 프로세스를 방지하기 위해 부모 프로세스와 자식 프로세스를 동기화 해야함 고아프로세스 자식 프로세스보다 부모 프로세스가 먼저 종료할 경우 자식 프로세스들은 고아 프로세스가 됨 고아 프로세스는 1번 프로세스(init)의 자식 프로세스로 등록

프로세스 동기화 함수[1] 프로세스 동기화: wait(3) #include <sys/types.h> stat_loc : 상태정보를 저장할 주소 wait 함수는 자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 함 부모 프로세스가 wait 함수를 호출하기 전에 자식 프로세스가 종료하면 wait 함수는 즉시 리턴 wait 함수의 리턴값은 자식 프로세스의 PID 리턴값이 -1이면 살아있는 자식 프로세스가 하나도 없다는 의미 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc);

[예제 6-8] wait 함수 사용하기 (test3.c) ... 07 int main(void) { 08 int status; 09 pid_t pid; 11 switch (pid = fork()) { 12 case -1 : /* fork failed */ 13 perror("fork"); 14 exit(1); 15 break; 16 case 0 : /* child process */ 17 printf("--> Child Process\n"); 18 exit(2); 19 break; 20 default : /* parent process */ 21 while (wait(&status) != pid) 22 continue; 23 printf("--> Parent process\n"); 24 printf("Status: %d, %x\n", status, status); 25 printf("Child process Exit Status:%d\n”,status >> 8); 26 break; } 29 return 0; 30 } # ex6_8.out --> Child Process --> Parent process Status: 512, 200 Child process Exit Status:2 자식 프로세스의 종료를 기다림 오른쪽으로 8비트 이동해야 종료 상태값을 알 수 있음

특정 자식 프로세스와 동기화: waitpid(3) 프로세스 동기화 함수[2] 특정 자식 프로세스와 동기화: waitpid(3) pid에 지정할 수 있는 값 -1보다 작은 경우 : pid의 절댓값과 같은 프로세스 그룹ID에 속한 자식 프로세스 중 임의의 프로세스의 상태값 요청 -1인 경우 : wait 함수처럼 임의의 자식 프로세스의 상태값을 요청 0인 경우 : 함수를 호출한 프로세스와 같은 프로세스 그룹에 속한 임의의 프로세스의 상태값 요청 0보다 큰 경우 : 지정한 PID의 상태값 요청 options: waitpid 함수의 리턴 조건 WCONTINUED: 수행중인 자식 프로세스의 상태값 리턴 WNOHANG: pid로 지정한 자식프로세스의 상태값을 즉시 리턴받을 수 없어도 이를 호출한 프로세스의 실행을 블록하지 않고 다른 작업을 수행토록 함 WNOWAIT: 상태값을 리턴한 프로세스가 대기 상태에 머물 수 있도록 함 WUNTRACED: 실행을 중단한 자식 프로세스의 상태값을 리턴 #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *stat_loc, int options);

[예제 6-9] waitpid 함수 사용하기 (test4.c) ... 07 int main(void) { 08 int status; 09 pid_t pid; 10 11 if ((pid = fork()) < 0) { /* fork failed */ 12 perror("fork"); 13 exit(1); 14 } 15 16 if (pid == 0) { /* child process */ 17 printf("--> Child process\n"); 18 sleep(3); 19 exit(3); 20 } 21 22 printf("--> Parent process\n"); 23 24 while (waitpid(pid, &status, WNOHANG) == 0) { printf("Parent still wait...\n"); 26 sleep(1); 27 } 28 29 printf("Child Exit Status : %d\n", status>>8); 30 31 return 0; 32 } # ex6_9.out --> Child process --> Parent process Parent still wait... Child Exit Status : 3 WNOHANG이므로 waitpid 함수는 블록되지 않고 25~26행 반복 실행

실습 fork 함수를 사용해 자식 프로세스에서는 로그인한 사용자의 정보를 출 력하고, 부모 프로세스에서는 현재 시간을 출력하도록 하는 프로그램을 작성하라 system(“who”) system(“date”)

목차(Chapter 9) 파이프의 개념 이름없는 파이프 만들기 복잡한 파이프 생성 양방향 파이프 활용 이름있는 파이프 만들기

파이프의 개념 파이프 간단한 파이프 생성 두 프로세스간에 통신할 수 있도록 해주는 특수 파일 그냥 파이프라고 하면 일반적으로 이름없는 파이프를 의미 이름 없는 파이프는 부모-자식 프로세스 간에 통신할 수 있도록 해줌 파이프는 기본적으로 단방향 간단한 파이프 생성 command : 쉘 명령 mode : “r”(읽기전용 파이프) 또는 “w”(쓰기전용 파이프) fork함수를 실행해 자식 프로세스를 만들고 command에서 지정한 명령을 exec 함수로 자식이 실행하도록 한다: execl(“/bin/sh”, “sh”, “-c”, command, (char *)0); waitpid함수를 수행하여 자식 프로세스들이 종료하기를 기다린다. 리턴값은 자식 프로세스의 종료상태이며, 실패하면 -1을 리턴한다 #include <stdio.h> FILE *popen(const char *command, const char *mode); #include <stdio.h> int pclose(FILE *stream);

[예제 9-1] popen 함수 사용하기(test5.c) ... 04 int main(void) { 05 FILE *fp; 06 int a; 07 08 fp = popen("wc -l", "w"); 09 if (fp == NULL) { 10 fprintf(stderr, "popen failed\n"); 11 exit(1); 12 } 13 14 for (a = 0; a < 100; a++) 15 fprintf(fp, "test line\n"); 16 17 pclose(fp); 18 19 return 0; 20 } “w”모드로 파이프 생성 자식프로세스는 wc –l 명령 수행 자식 프로세스로 출력 결과는 무엇일까?

[예제 9-2] popen 함수 사용하기(test6.c) ... 04 int main(void) { 05 FILE *fp; 06 char buf[256]; 07 08 fp = popen("date", "r"); 09 if (fp == NULL) { fprintf(stderr, "popen failed\n"); 11 exit(1); 12 } 13 14 if (fgets(buf, sizeof(buf), fp) == NULL) { 15 fprintf(stderr, "No data from pipe!\n"); 16 exit(1); 17 } 18 19 printf("line : %s\n", buf); 20 pclose(fp); 21 22 return 0; 23 } 자식 프로세스는 date 명령 실행 읽기모드로 파이프생성 파이프에서 데이터 읽기 # ex9_2.out line : 2010년 2월 5일 금요일 오후 11시 20분 40초

복잡한 파이프 생성[1] 파이프 만들기: pipe(2) pipe 함수로 통신과정 (test7.c) 파이프로 사용할 파일기술자 2개를 인자로 지정 fildes[0]는 읽기, fildes[1]은 쓰기용 파일 기술자 pipe 함수로 통신과정 (test7.c) piep 함수를 호출하여 파이프로 사용할 파일기술자 생성 #include <unistd.h> int pipe(int fildes[2]);

복잡한 파이프 생성[2] 2. fork 함수로 자식 프로세스 생성. pipe도 자식 프로세스로 복사됨(test8.c) 3. 통신방향 결정(파이프는 기본적으로 단방향)(test9.c)

[예제 9-3] pipe 함수 사용하기(test10.c) ex9_3.c ... 06 int main(void) { 07 int fd[2]; 08 pid_t pid; 09 char buf[257]; int len, status; 11 12 if (pipe(fd) == -1) { 13 perror("pipe"); 14 exit(1); 15 } 16 17 switch (pid = fork()) { 18 case -1 : 19 perror("fork"); 20 exit(1); 21 break; 파이프 생성 fork로 자식 프로세스 생성

[예제 9-3] pipe 함수 사용하기(test10.c) 22 case 0 : /* child */ 23 close(fd[1]); 24 write(1, "Child Process:", 15); 25 len = read(fd[0], buf, 256); 26 write(1, buf, len); 27 close(fd[0]); 28 break; 29 default : 30 close(fd[0]); 31 buf[0] = '\0'; 32 write(fd[1], "Test Message\n", 14); 33 close(fd[1]); 34 waitpid(pid, &status, 0); 35 break; 36 } 37 38 return 0; 39 } 자식 프로세스는 파이프에서 읽을 것이므로 쓰기용 파일기술자(fd[1])를 닫는다. 파이프에서 읽기 부모 프로세스는 파이프에 쓸 것이므로 읽기용 파일기술자(fd[0])를 닫는다. 파이프에 텍스트를 출력 # ex9_3.out Child Process:Test Message

실습 popen, pclose 함수를 사용해 부모 프로세스가 보낸 파일의 내용을 자 식 프로세스가 페이지 단위로 출력하는 프로그램을 작성하라. 출력할 파 일명은 명령행 인자로 받는다 자식 fp1=popen(“more”, “w”) 부모 fp2=fopen(argv[1], “r”); while(fgets(buf, 256, fp) != NULL) fputs(buf, fp1); pipe함수를 이용해 구현하라 execlp(“more”, “more”, buf, (char *)NULL)