슬라이드 1

Similar documents
제1장 Unix란 무엇인가?

슬라이드 1

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

2009년 상반기 사업계획

6주차.key

ABC 11장

슬라이드 1

좀비프로세스 2

Microsoft PowerPoint - 09-Pipe

제1장 Unix란 무엇인가?

10.

제12장 파일 입출력

/chroot/lib/ /chroot/etc/

PowerPoint 프레젠테이션

2009년 상반기 사업계획

슬라이드 1

untitled

Microsoft PowerPoint - chap9 [호환 모드]

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

chap7.key

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

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

제9장 프로세스 제어

Microsoft PowerPoint - 10_Signal

Chap06(Interprocess Communication).PDF

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint APUE(File InO).pptx

2009년 상반기 사업계획

Microsoft PowerPoint - chap2

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

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Chapter #01 Subject

<4D F736F F F696E74202D FC7C1B7CEBCBCBDBA20BBFDBCBAB0FA20BDC7C7E0205BC8A3C8AF20B8F0B5E55D>

2009년 상반기 사업계획

UniStore

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Chap04(Signals and Sessions).PDF

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - [2009] 02.pptx

System Programming Lab

리눅스 프로세스 관리

Abstract View of System Components

Microsoft PowerPoint APUE(File InO)

PowerPoint 프레젠테이션

Sena Technologies, Inc. HelloDevice Super 1.1.0

제1장 Unix란 무엇인가?

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

Microsoft PowerPoint APUE(File InO).ppt

Microsoft PowerPoint APUE(Intro).ppt

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

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

KEY 디바이스 드라이버

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다고가정하자. / /bin/ /home/ /home/taesoo/ /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자가터미널에서다음 ls 명령입력시화면출력

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

강의10

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

vi 사용법

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<C1A63130C0E5C7C1B7CEBCBCBDBA2E687770>

Microsoft PowerPoint - 10_Process

Microsoft PowerPoint - chap12 [호환 모드]

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>


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

제1장 Unix란 무엇인가?

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

PowerPoint 프레젠테이션

Microsoft PowerPoint - SP6장-시그널.ppt [호환 모드]

Microsoft PowerPoint - chap4 [호환 모드]

Microsoft Word - Network Programming_NewVersion_01_.docx

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다. / /bin/ /home/ /home/taesoo/ /home/taesoo/downloads /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자 (t

Microsoft PowerPoint - lab14.pptx

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

로봇SW교육원 강의자료

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

Microsoft PowerPoint - 알고리즘_4주차_1차시.pptx

메시지큐를이용한 IPC 프로그램구현과제보고서 1. 과제의목적 1 리눅스가지원하는프로세스간통신방식중다수의프로세스사이에구조화된데이터블럭, 즉메시지를전달하는데주로사용되는메시지큐방식에대하여무엇인지, 어떻게사용하는지공부한다. 2 공부한내용을점검하기위해기작성된 epda 프로세스관

제8장 프로세스

교육지원 IT시스템 선진화

The Pocket Guide to TCP/IP Sockets: C Version

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

로봇SW교육원 강의자료

<4D F736F F F696E74202D BDC3B1D7B3CEB0FA20BDC3B1D7B3CE20C3B3B8AE2E707074>

제8장 프로세스

SRC PLUS 제어기 MANUAL

歯9장.PDF

BMP 파일 처리

Chapter_06

쉽게 풀어쓴 C 프로그래밍

chap12(process).hwp

API 매뉴얼

Transcription:

7.4 프로세스간통신 Interprocess Communication

기본적인프로세스간통신기법 데이터스트림과파이프 data stream and pipe 정보의송수신에사용되는일련의연속된데이터 a sequence of data used to send or receive information 예 : 프로세스와파일 ( 파일디스크립터을통하여 ) 을연결해주는데이터스트림 한쪽방향으로만가능함. 파일의경우입력, 출력의양방향연산을하므로쓰기 / 읽기각각의디스크립터를사용 파이프 : 프로세스사이를연결해주는데이터스트림 한프로세스의출력을다른프로세스의입력으로연결함 [Unix/Linux] 두종류의파이프 : (unnamed) pipe, named pipe unnamed pipe: 통상 pipe 라고부름 파일시스템에존재하지않고, 커널버퍼에의해데이터저장 - 인출 named pipe: FIFO(First In First Out) 라고부름 named pipe 는파일시스템에파일로서존재. 그러나실제디스크에는저장되지않고디렉토리에이름만존재하며, 파일의내용은주기억에저장됨. 파이프메커니즘에는 file position 이없음. 즉, lseek() 사용불가. 프로세스 1 파이프 프로세스 2 Spring 2010 System Programming (Shin) 2

파이프 pipe 파이프란? 프로세스사이를연결해주는데이터스트림 한프로세스의출력을다른프로세스의입력으로연결함 연결수단은읽기와쓰기파일디스크립터에의존함 데이터는커널의버퍼 (pipe buffer) 에저장되어전달되며, 외부에서접근할수없음. 두프로세스 (producer, consumer) 는파이프버퍼를사이에두고데이터에대한동기화가이루어짐. 즉, 한프로세스가버퍼에순차적으로데이터를써넣으면, 다른프로세스가차례로읽어감. 실제, 부모 ( 조상 )- 자식 ( 자손 ), 자식 - 자식프로세스사이의통신만가능 예 : Linux commands: prompt> ls l more 기호 은파이프를나타냄. ls 와 more 는 shell 의자식프로세스 파이프의제약점 하나의작업에서한방향으로만데이터전달가능 (half duplex) 즉, 읽고쓰기를섞어서할수없고, 한번읽기연산을하면그작업이끝날때까지읽기만가능함. 쓰기를하려면, 읽기가끝난후가능. 부모 - 자손, 조상이같은자손 - 자손프로세스사이에서만가능. 즉, file descriptor inheritance 가적용되는경우에만가능 예를들면, 디몬 (daemon) 과의데이터전달이불가능함 Spring 2010 System Programming (Shin) 3

pipe 관련시스템콜 #include <unistd.h> 파이프 int pipe(int fd[2]) 프로세스자신에주어지는파일디스크립터 (file descriptor, fd) 를설정함. 파일입출력과같은방법으로스트림을읽고씀. fd[0]: 읽기용, fd[1]: 쓰기용 read/write 는일반적인파일입출력을따름. 즉, ssize_t read(int fd, void *buf, size_t count) ssize_t write(int fd, const void *buf, size_t count) 한연산에서, 둘중하나만가능 file descriptor user process pipe(fd) fd[0] = 3 fd[1] = 4 pipe buffer ( 주기억에존재 ) kernel 어떤파일을접근하기위한추상적인키 (key). 이것이지정하는자료구조에의해다음정보를제공 : 파일에의포인터, 접근권리, 읽기 / 쓰기모드, 파일포지션, 등. fork 혹은 exec 에의해생성된자식프로세스는부모의 file descriptor 를물려받음. Spring 2010 System Programming (Shin) 4

[ 註 例 ] 파이프 파이프의사용방법 ( 예 ) 1. pipe() 호출 // fd[0](read), fd[1](write) 생성 2. fork() 호출 // 부모 (P), 자식 (C) 프로세스생성 3. 데이터전달 // 한방향으로만가능 half duplex (a) P sends to C: P 는 fd[0] 를닫고, fd[1] 에쓰기. C 는 fd[1] 을닫고, fd[0] 에서읽기 (b) C sends to P: C 는 fd[0] 를닫고, fd[1] 에쓰기. P 는 fd[1] 를닫고, fd[0] 에서읽기. full duplex pipe? 파이프는한작업에서한방향으로만데이터를전달할수있으므로 (half duplex), 만일양방향으로데이터를전달하려고하면 (full duplex) 미리두개의파이프를생성 ( 즉 pipe() 호출을두번수행 ) 하여, 각파이프를각방향으로지정함 pipe quiz (case 1) the producer does a close() on the pipe s write end, then can the consumer read any data buffered in the pipe? {Y (case 2) the consumer does a close() on the pipe s read end, then can the producer write data to the write end? {N Spring 2010 System Programming (Shin) 5

[ 註 例 ] 파이프 예제 : echo printing 이예에서는파이프하나를양방향으로사용하되, 부모가보내기작업이끝나면자식이보내기작업을시작함. 시나리오 1. 부모프로세스는표준입력으로부터입력된문자열을파이프를이용하여자식프로세스로보냄. 2. 자식프로세스는부모프로세스가보내온문자열을복사한다음, 다시파이프를이용하여부모프로세스에반송함 (echo) 3. 부모프로세스는자식에게서보내온문자열을표준출력으로출력함 부모프로세스 parent.c 다음쪽에계속 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { char string_in[32], string_echo[32]; int fd[2], status; if (pipe(fd) < 0) { exit(exit_failure); fgets(string_in, sizeof(string_in), stdin); /* Step 1 */ if (fork() == 0) { if (execl("./child", "child", fd[0], fd[1], NULL) < 0) { exit(exit_failure); write(fd[1], &string_in, sizeof(string_in)); /* Step 1 */ wait(&status); read(fd[0], &string_echo, sizeof(string_echo)); /* Step 3 */ printf("echoed: %s\n", &string_echo); /* Step 3 */ close(fd[0]); close(fd[1]); return EXIT_SUCCESS; Spring 2010 System Programming (Shin) 6

#include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv[]) { char str_in[32], str_echo[32]; int read_fd, write_fd; read_fd = atoi(argv[1]); write_fd = atoi(argv[2]); [ 註 例 ] 파이프 자식프로세스 child.c ( 실행파일 : child) /* Step 2: echo */ read(read_fd, &str_in, sizeof(str_in)); strncpy(str_echo, str_in, sizeof(str_echo)); write(write_fd, &str_echo, sizeof(str_echo)); close(read_fd); close(write_fd); return EXIT_SUCCESS; stdin stdout 부모프로세스 parent pipe() fork() write() read() fd[0] fd[1] pipe buffer fd[0] fd[1] 자식프로세스 child echo Spring 2010 System Programming (Shin) 7

FIFOs (Named Pipes) FIFO 혹은 named pipe FIFO(First In First Out): unnamed pipe 의문제점을해결 일시적인버퍼를사용하지않고파일시스템에존재하는 persistent 객체를이용함 서로 ancestor-descendent 관계가없어도서로데이터를교환할수있음 named pipe(fifo) 의속성 named pipe 는파일시스템에파일로서존재. 그러나실제디스크에는저장되지않고디렉토리에이름만존재하며, 파일의내용은주기억에저장됨. 이파일은특수한파일로서한프로세스 (Pp, producer) 가이파일에데이터를차례로써넣으면, 다른프로세스 (Pc, consumer) 가써진순서대로읽어감. 일단읽으면, 데이터는지워짐. 즉, Pp 와 Pc 는동기화되어, Pp 는 Pc 가읽을때까지기다리고, Pc 는 Pp 가쓸때까지기다림. Spring 2010 System Programming (Shin) 8

FIFOs (Named Pipes) shell 에서의예 mkfifo [-m permission_mode] names default permission mode: 666 8 $ mkfifo m 600 fifo1 $ cat <fifo1 wc l & {background 실행 $ cat /etc/passwd >fifo1 위의예에서 cat <fifo1 에서아직 fifo1 이비어있으므로, 데이터가입력될때까지기다림 ( 동기화 ). producer-consumer 의예 : 위의예에서 cat <fifo1 wc l & 명령을두번입력하여실행하면 첫번째는 fifo1 가다찼을때수행되므로 passwd 파일의라인수가출력됨 두번째는첫번째실행에서 fifo1 의데이터가다소비되어, 빈파일이므로 0 이출력됨 system call int mkfifo(const char *pathname, mode_t mode); fifo special file 에대한 open/read/write 등은파일에대한일반적인명령을사용함 Spring 2010 System Programming (Shin) 9

[ 註 例 ] FIFOs (Named Pipes) 시나리오 rdfifo : 읽기를위한 fifo 를생성하여오픈한후, fifo 의출력을 stdout 에보임 wrfifo : 쓰기를위해 fifo 를오픈하고쓰기연산을수행 /* wrfifo.c - Write to a "well-known" FIFO */ int main(void) { int fd; /* Descriptor for FIFO */ int len; /* Bytes written to FIFO */ char buf[pipe_buf]; /* Ensure atomic writes */ time_t tp; /* For time call */ /* rdfifo.c - Create a FIFO and read from it */ int main(void) #include <sys/types.h> printf("i am %d\n", getpid()); /* Identify myself */ { #include <sys/stat.h> /* Open the FIFO write-only */ if((fd = open("fifo1", O_WRONLY)) < 0) { int fd; /* Descriptor for FIFO */ #include <unistd.h> perror("open"); int len; /* Bytes read from FIFO */ #include <errno.h> exit(exit_failure); char buf[pipe_buf]; #include <stdio.h> mode_t mode = 0666; #include <stdlib.h> /* Generate some data to write */ if((mkfifo("fifo1", mode)) < 0) { #include <fcntl.h> while(1) { time(&tp); /* Get the current time */ perror("mkfifo"); #include <limits.h> /* Create the string to write */ exit(exit_failure); len = sprintf(buf, "wrfifo %d sends %s", getpid(), ctime(&tp)); /* Open the FIFO read-only */ /* Use (len + 1) because sprintf does not count if((fd = open("fifo1", O_RDONLY)) < 0) { the terminating null */ perror("open"); if((write(fd, buf, len + 1)) < 0) { exit(exit_failure); perror("write"); close(fd); /* Read and display the FIFO's output until EOF */ exit(exit_failure); while((len = read(fd, buf, PIPE_BUF - 1)) > 0) printf("rdfifo read: %s", buf); sleep(3); close(fd); close(fd); exit(exit_success); Source: Kurt Wall, Linux Programming by exit(exit_success); Example, Que, 2000, pp. 333-336 Spring 2010 System Programming (Shin) 10

시그널 signals 시그널 (signal) 이란? 사용자 ( 단말 ) 나커널이프로세스에연락하는방법 작은메시지로서, 시스템에서어떤이벤트가발생했음을프로세스에게알려줌 예외 (exception) 나인터럽트를커널레벨에서표현한것 (kernel abstraction) signal 에의해주어지는정보는단지 signal id( 정수 ) 와도착사실임 ID Name Default Action Corresponding Event 2 SIGINT Terminate ( 종료 ) Interrupt from keyboard (ctl-c) 9 SIGKILL Terminate Kill program (cannot override or ignore) 11 SIGSEGV Terminate & Dump Segmentation violation 14 SIGALRM Terminate Timer signal 17 SIGCHLD Ignore Child stopped or terminated Spring 2010 System Programming (Shin) 11

시그널 시그널의전송 커널이시그널을목적지프로세스 (destination process) 에보낸다는것은그프로세스의문맥에서어떤상태를갱신하는것 커널은다음의이유로시그널을보냄 커널이 divide-by-zero (SIGFPE) 혹은자식프로세스의종료 (SIGCHLD) 등의시스템이벤트를검출했을때 다른프로세스가목적지프로세스에시그널을보낼것을커널에명시적으로요청하기위해 kill system call 을호출했을때 시그널의수신 목적지프로세스가시그널을수신한다는것은커널이시그널을보낸데대해반응을보이는것임 다음과같이반응함 시그널을무시 (do nothing) 프로세스를종료 signal handler 라불리는사용자레벨의함수를실행함으로서 signal 을받음 (catch) - 인터럽트핸들러와유사함 프로세스의 core dump 를작성하고이상 ( 異常 ) 종료 Spring 2010 System Programming (Shin) 12

[ 註 例 ] 시그널 키보드에서시그널전송 ctrl-c (ctrl-z) 을키보드에서입력하면 SIGTERM (SIGTSTP) 를 foreground process group 에속하는모든작업에전송. SIGTERM 디폴트액션은각프로세스를종료하는것 SIGTSTP 디폴트액션은각프로세스를중단 (suspend) 하는것 사용예 : ctrl-c 와 ctrl-z linux> traceroute www.snu.ac.kr traceroute to moose.snu.ac.kr (147.46.10.48) 30 hops max, 38 byte packets 1 147.46.114.1 (147.46.114.1) 0.421 2 147.47.20.125 (147.47.20.125) 0.561 ms 3 * * * <typed ctrl-z> [1]+ Stopped traceroute www.snu.ac.kr linux> ps -l F S UID PID PPID TIME CMD 0 S 800 12536 12535 00:00:00 bash 4 T 800 14060 12536 00:00:00 traceroute 0 R 800 14066 12536 00:00:00 ps linux> fg traceroute www.snu.ac.kr 4 * * * <typed ctrl-c> linux> ps -l F S UID PID PPID TIME CMD 0 S 800 12536 12535 00:00:00 bash 0 R 800 14095 12536 00:00:00 ps Spring 2010 System Programming (Shin) 13

그밖의프로세스간통신기법 공유기억 ( 공유메모리 ) 를이용한프로세스간통신 여러개의프로세스가공통으로이용할수있는메모리공간제공 다수의프로세서가주기억 ( 메모리 ) 을공유하는경우, 멀티프로세서 (multiprocessors) 라부름 메시지를이용한프로세스간통신 메시지란일반적으로정보의집합체로서소스에서목적지로전달됨 두개의프로세스사이에서메시지를이용하여데이터송수신 이때프로세스는서로다른컴퓨터나프로세서에위치할수있음. 네트워크로연결된분산시스템에서원격프로세스간통신에이용될수있음 원격프로시져호출 (remote procedure calling) 네트워크로연결된원격컴퓨터의프로그램을호출 ( 실행 ) 하는메커니즘 메시지를이용하여요청 / 응답을송신 클라이언트 - 서버시스템에이용가능 Spring 2010 System Programming (Shin) 14

[ 註 例 ] 그밖의프로세스간통신기법 프로세스 프로세스 공유메모리 프로세스 프로세스 공유메모리를이용한통신 발신프로세스 메시지큐에저장 message queue 메시지큐에서인출 수신프로세스 메시지큐를이용한메시지통신 ( 단일컴퓨터시스템 ) Spring 2010 System Programming (Shin) 15