pipe - whdlgp/system_programming_pra GitHub Wiki

Inter-Process Communication(IPC)

์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ์“ฐ๋ž˜๋“œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. RTOS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ฃผ๋กœ ํ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ด์šฉํ–ˆ๋Š”๋ฐ, ์œ ๋‹‰์Šค์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ๊ณต์œ ์ž์› ์˜์—ญ(์ „์—ญ๋ณ€์ˆ˜ ๊ฐ™์€)
  • ์†Œ์ผ“ํ†ต์‹ 
  • Pipe

์ด์ค‘ Pipe๋Š” ๋‘๊ฐœ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

pipe

pipe(ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฐฐ์—ด(๊ธธ์ด2))

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ธธ์ด๊ฐ€ 2์ธ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•œ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

int fd[2];

๊ทธ ํ›„ ํŒŒ์ผ์„ open ํ•œ ํ›„์— pipe ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค๋ฉด

pipe(fd);
  1. fd[1]๋กœ ๊ฐ’์„ ์จ ๋„ฃ์œผ๋ฉด
  2. fd[0]์œผ๋กœ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

pipe.c

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


#define BUFSIZE 8192

int main() 
{
	char inbuf[BUFSIZE];
	int p[2], j, pid;

	/* open pipe */
	if(pipe(p) == -1) 
	{
		perror("pipe call error");
		exit(1);
	}

	switch(pid = fork())
	{
	case -1: perror("error: fork failed"); 
		exit(2);
	case 0: /* if child then write down pipe */
		close(p[0]); /* first close the read end of the pipe */
		write(p[1], "Hello there.", 12);
		write(p[1], "This is a message.", 18);
		write(p[1], "How are you?", 12);
		break;
	default: /* parent reads pipe */
		close(p[1]); /* first close the write end of the pipe */
		read(p[0], inbuf, BUFSIZE); /* What is wrong here?? */
		printf("Parent read: %s\n", inbuf);
		wait(NULL);
	}

	exit(0);
}
Parent read: Hello there.This is a message.How are you?

fork ์ „์— pipe ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์šฉ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ง€์ •ํ•˜๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋„ค๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐ›๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณผ ์ ์€, ์“ฐ๋Š” ์ชฝ์—์„œ๋Š” ์ฝ๊ธฐ์šฉ p[0]๋ฅผ close ํ•˜๊ณ , ์ฝ๋Š” ์ชฝ์—์„œ๋Š” ์“ฐ๊ธฐ์šฉ p[1]์„ close ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ ์ค‘๊ฐ„์— ์ฃผ์„์œผ๋กœ

/* What is wrong here?? */

์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๊ณผ์—ฐ read ํ•จ์ˆ˜๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ• ๊นŒ? ๋ผ๋Š” ์˜๋ฌธ์„ ๋˜์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์‹ค์ œ๋กœ ์œ„ ์˜ˆ์ œ๋Š” ๋‚ด PC ์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑด ์“ฐ๊ธฐ ์†๋„๊ฐ€ ๋นจ๋ž๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ ์ „์— ์šด์ด ์ข‹๊ฒŒ ๋‹ค ์“ฐ์—ฌ์กŒ๋˜๊ฒŒ ์•„๋‹๊นŒ ์ƒ๊ฐํ•œ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋ณธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ด๋ ‡๋‹ค.

  • while ๋ฌธ์œผ๋กœ ์ฝ๊ธฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ฝ๊ธฐ ๋™์ž‘์€ rio_readlineb ๋“ฑ์„ ์ด์šฉํ•œ๋‹ค. ๋ณด๋‚ผ๋•Œ '\n' ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.
  • ๋˜๋Š” ๋ณ„๋„์˜ ํŠน์ˆ˜ํ•œ ๋ฌธ์ž๋ฅผ ์ด์šฉํ•ด "๋ฐ์ดํ„ฐ์˜ ๋"์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ.

์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์‹œ์—๋Š” ๋ณ„๋„๋กœ ํ”„๋กœํ† ์ฝœ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ, ์ด๋Ÿฐ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋Š”๊ฒƒ๋„ ๋‚˜๋ฆ„ ์“ธ๋งŒํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ