IPC μμ€ν μ μ¬λ‘(Examples of IPC Systems)
μ΄μ μ IPCμ κ°λ μ λν΄ μ΄ν΄λ³΄μμ΅λλ€. μ΄λ²μλ λ€ κ°μ§ λ€λ₯Έ IPC μμ€ν μ μ¬λ‘μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
- POSIX 곡μ λ©λͺ¨λ¦¬(POSIX Shared Memory)
- Mach λ©μμ§ μ λ¬(Mach Message Passing)
- Windows
- νμ΄ν(Pipes)
1. POSIX 곡μ λ©λͺ¨λ¦¬(POSIX Shared Memory)
곡μ λ©λͺ¨λ¦¬ λ©μμ§μ μ λ¬μ ν¬ν¨νμ¬ POSIX μμ€ν μ μν λ€μμ IPC κΈ°λ²μ΄ μ¬μ© κ°λ₯ν©λλ€. μ¬κΈ°μ 곡μ λ©λͺ¨λ¦¬λ₯Ό μν POSIX APIλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
POSIX 곡μ λ©λͺ¨λ¦¬λ λ©λͺ¨λ¦¬-μ¬μ νμΌμ μ¬μ©νμ¬ κ΅¬νλ©λλ€. λ©λͺ¨λ¦¬-μ¬μ νμΌμ 곡μ λ©λͺ¨λ¦¬μ νΉμ μμμ νμΌκ³Ό μ°κ΄μν΅λλ€. νλ‘μΈμ€λ λ¨Όμ μλμ κ°μ΄ shm_open() μμ€ν μ½μ μ¬μ©νμ¬ κ³΅μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό μμ±ν΄μΌ ν©λλ€.
fd = shm_open(name, O_CREATE | O_RDWR, 0666);
첫 λ²μ§Έ μΈμλ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ μ΄λ¦μ μ§μ ν©λλ€. 곡μ λ©λͺ¨λ¦¬μ μ κ·Όνκ³ μ νλ νλ‘μΈμ€λ μ΄ μ΄λ¦μ ν΅νμ¬ κ°μ²΄λ₯Ό μΈκΈν©λλ€. μ΄μ΄μ λ λ²μ§Έ μΈμλ κ°μ²΄κ° μ‘΄μ¬νμ§ μμΌλ©΄ μμ±λκ³ (O_CREATE) κ°μ²΄λ μ½κΈ°μ μ°κΈ°κ° κ°λ₯ν μνλ‘ μ΄λ¦°λ€λ κ²μ λνλ λλ€(O_RDWR). λ§μ§λ§ μΈμλ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ νμΌ-μ κ·Ό νκ°κΆμ λΆμ¬ν©λλ€. shm_open()μ΄ μ±κ³΅νλ©΄ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό λνλ΄λ μ μν νμΌ μ€λͺ μλ₯Ό λ°νν©λλ€.
κ°μ²΄κ° μ€μ λλ©΄ ftruncate() ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄μ ν¬κΈ°λ₯Ό λ°μ΄νΈ λ¨μλ‘ μ€μ ν©λλ€. λ€μκ³Ό κ°μ νΈμΆμ κ°μ²΄μ ν¬κΈ°λ₯Ό 4096λ°μ΄νΈλ‘ μ€μ ν©λλ€.
ftruncate(fd, 4096);
λ§μ§λ§μΌλ‘ mmap() ν¨μκ° κ³΅μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό ν¬ν¨νλ λ©λͺ¨λ¦¬-μ¬μ νμΌμ ꡬμΆν©λλ€.mmap() ν¨μλ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ μ κ·Όν λ μ¬μ©λ λ©λͺ¨λ¦¬-μ¬μ νμΌμ ν¬μΈν°λ₯Ό λ°νν©λλ€.
μλ λ μ½λμ νλ‘κ·Έλ¨μ 곡μ λ©λͺ¨λ¦¬λ₯Ό ꡬννκΈ° μνμ¬ μμ°μ-μλΉμ λͺ¨λΈμ μ¬μ©ν©λλ€.
μ½λ 1) POSIX곡μ λ©λͺ¨λ¦¬ APIλ₯Ό μ€λͺ νλ μμμ νλ‘μΈμ€
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
/* the size (in bytes) of shared memory object */
const int SIZE = 4096;
/* name of the shared memory object */
const char *name = "OS";
/* strings written to shared memory */
const char *message 0 = "Hello";
const char *message 1 = "World!";
/* shared memory file descriptor */
int fd;
/* pointer to shared memory obect */
char *ptr;
/* create the shared memory object */
fd = shm open(name,O CREAT | O RDWR,0666);
/* configure the size of the shared memory object */
ftruncate(fd, SIZE);
/* memory map the shared memory object */
ptr = (char *)
mmap(0, SIZE, PROT READ | PROT WRITE, MAP SHARED, fd, 0);
/* write to the shared memory object */
sprintf(ptr,"%s",message 0);
ptr += strlen(message 0);
sprintf(ptr,"%s",message 1);
ptr += strlen(message 1);
return 0;
}
μ½λ 2) POSIX 곡μ λ©λͺ¨λ¦¬ APIλ₯Ό μ€λͺ νλ μλΉμ νλ‘μΈμ€
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
/* the size (in bytes) of shared memory object */
const int SIZE = 4096;
/* name of the shared memory object */
const char *name = "OS";
/* shared memory file descriptor */
int fd;
/* pointer to shared memory obect */
char *ptr;
/* open the shared memory object */
fd = shm open(name, O RDONLY, 0666);
/* memory map the shared memory object */
ptr = (char *)
mmap(0, SIZE, PROT READ | PROT WRITE, MAP SHARED, fd, 0);
/* read from the shared memory object */
printf("%s",(char *)ptr);
/* remove the shared memory object */
shm unlink(name);
return 0;
}
μμ°μλ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό ꡬμΆνκ³ κ³΅μ λ©λͺ¨λ¦¬μ λ°μ΄ν°λ₯Ό μ°κ³ , μλΉμλ 곡μ λ©λͺ¨λ¦¬μμ λ°μ΄ν°λ₯Ό μ½μ΅λλ€. μ μ½λ 1μμ λ³΄μΈ μμ°μλ OSλΌκ³ λͺ λͺ λ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό μμ±νκ³ λ¬Έμμ΄ "Hello World"λ₯Ό 곡μ λ©λͺ¨λ¦¬μ μλλ€. νλ‘κ·Έλ¨μ μ§μ λ ν¬κΈ°μ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄λ₯Ό λ©λͺ¨λ¦¬μ μ¬μνκ³ κ°μ²΄μ μ°κΈ° κΆνμ λΆμ¬ν©λλ€. MAP_SHARED νλκ·Έλ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ λ³κ²½μ΄ λ°μνλ©΄ κ°μ²΄λ₯Ό 곡μ νλ λͺ¨λ νλ‘μΈμ€κ° μ΅μ μ κ°μ μ κ·Όνκ² λλ€λ κ²μ μ§μ ν©λλ€. 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ μ°κΈ° μμ μ ν λ sprintf() ν¨μλ₯Ό νΈμΆνκ³ μΆλ ₯ νμμ΄ μμ±λ λ¬Έμμ΄μ ptrμ΄ κ°λ¦¬ν€λ 곡μ λ©λͺ¨λ¦¬ κ°μ²΄μ μ°μΈλ€λ κ²μ μ£Όμν΄μΌ ν©λλ€. μ°κΈ° μμ μ΄ μ±κ³΅νλ©΄ μ°μΈ λ°μ΄νΈ μλ§νΌ ν¬μΈν°λ₯Ό λ°λμ μ¦κ°μμΌμΌ ν©λλ€.
μ½λ 2μ μλΉμ νλ‘μΈμ€λ 곡μ λ©λͺ¨λ¦¬μ λ΄μ©μ μ½κ³ μΆλ ₯ν©λλ€. λν μλΉμλ shm_unlink() ν¨μλ₯Ό νΈμΆνμ¬ μ κ·Όμ΄ λλ 곡μ λ©λͺ¨λ¦¬λ₯Ό μ κ±°ν©λλ€.
2. Mach λ©μμ§ μ λ¬(Mach Message Passing)
λ€μ λ©μμ§ μ λ¬μ μλ‘ Mach μ΄μ체μ λ₯Ό κ³ λ €ν΄ λ΄ μλ€. Machλ νΉν λΆμ° μμ€ν μ©μΌλ‘ μ€κ³λμμ§λ§ macOS λ° iOS μ΄μ체μ μ ν¬ν¨λ μ¬μ€μ΄ μ μ¦νλ―μ΄ λ°μ€ν¬ν± λ° λͺ¨λ°μΌ μμ€ν μλ μ ν©ν©λλ€.
Mach 컀λμ νλ‘μΈμ€μ μ μ¬νμ§λ§ μ μ΄ μ€λ λκ° λ§κ³ κ΄λ ¨ μμμ΄ μ μ λ€μ€ νμ€ν¬μ μμ± λ° μ κ±°λ₯Ό μ§μν©λλ€. λͺ¨λ νμ€ν¬ κ° ν΅μ μ ν¬ν¨νμ¬ Machμμ λλΆλΆμ ν΅μ μ λ©μμ§λ‘ μνλ©λλ€. Machμμ ν¬νΈ(port)λΌκ³ νλ λ©μΌλ°μ€λ‘ λ©μμ§λ₯Ό μ£Όκ³ λ°μ΅λλ€. ν¬νΈλ ν¬κΈ°κ° μ ν΄μ Έ μκ³ λ¨λ°©ν₯μ λλ€. μλ°©ν₯ ν΅μ μΈ κ²½μ° λ©μμ§κ° ν ν¬νΈλ‘ μ μ‘λκ³ μλ΅μ΄ λ³λμ μλ΅ ν¬νΈλ‘ μ μ‘λ©λλ€. κ° ν¬νΈμλ μ¬λ¬ μ‘μ μκ° μμ μ μμ§λ§ μμ μλ μ€μ§ νλλ§ μ‘΄μ¬ν©λλ€. Machλ ν¬νΈλ₯Ό μ¬μ©νμ¬ νμ€ν¬, μ€λ λ, λ©λͺ¨λ¦¬ λ° νλ‘μΈμμ κ°μ μμμ λνλ΄λ©°, λ©μμ§ μ λ¬μ μ΄λ¬ν μμ€ν μμ λ° μλΉμ€μ μνΈ μμ©νκΈ° μν κ°μ²΄ μ§ν₯ μ κ·Ό λ°©μμ μ 곡ν©λλ€. λμΌν νΈμ€νΈ λλ λΆμ° μμ€ν μ λ³λ νΈμ€νΈμ λ ν¬νΈ μ¬μ΄μμ λ©μμ§ μ λ¬μ΄ λ°μν μ μμ΅λλ€.
κ° ν¬νΈμλ κ·Έ ν¬νΈμ μνΈ μμ©νλ λ° νμν μ격μ μλ³νλ ν¬νΈ κΆν μ§ν©μ΄ μ°κ΄λ©λλ€. μλ₯Ό λ€μ΄, νμ€ν¬κ° ν¬νΈμμ λ©μμ§λ₯Ό μμ νλ €λ©΄ ν΄λΉ ν¬νΈμ λν΄ MACH_PORT_RIGHT_RECEIVE μκ²©μ΄ μμ΄μΌ ν©λλ€. ν¬νΈλ₯Ό μμ±ν νμ€ν¬κ° ν΄λΉ ν¬νΈμ μμ μμ΄λ©°, μμ μλ ν΄λΉ ν¬νΈμμ λ©μμ§λ₯Ό μμ ν μ μλ μ μΌν νμ€ν¬μ λλ€. ν¬νΈμ μμ μλ ν¬νΈμ μ격μ μ‘°μν μλ μμ΅λλ€. μ΄λ¬ν μ‘°μμ μΌλ°μ μΌλ‘ μλ΅ ν¬νΈλ₯Ό μ€μ ν λ μνλ©λλ€. μλ₯Ό λ€μ΄, νμ€ν¬ T1μ΄ ν¬νΈ P1μ μμ νκ³ νμ€ν¬ P2κ° μμ ν ν¬νΈ P2μ λ©μμ§λ₯Ό μ μ‘νλ€κ³ κ°μ ν©μλ€. T1μ΄ T2λ‘λΆν° μλ΅μ λ°μΌλ €λ©΄ T2μ ν¬νΈ P1μ λν MACH_PORT_RIGHT_SEND κΆνμ λΆμ¬ν΄μΌ ν©λλ€. ν¬νΈ κΆνμ μμ κΆμ νμ€ν¬μκ² μ£Όμ΄μ§λλ€. μ¦, λμΌν νμ€ν¬μ μνλ λ κ°μ μ€λ λλ κ° μ€λ λμ κ΄λ ¨λ μ€λ λ-λ³ ν¬νΈλ₯Ό ν΅ν΄ λ©[μμ§λ₯Ό κ΅ννμ¬ μ½κ² ν΅μ ν μ μμ΅λλ€.
νμ€ν¬κ° μμ±λλ©΄ Task Self ν¬νΈμ Notify ν¬νΈλΌλ λ κ°μ νΉλ³ν ν¬νΈλ μμ±λ©λλ€. 컀λμ Task Self ν¬νΈμ λν μμ κΆνμ κ°μ§κ³ μμ΄ νμ€ν¬κ° 컀λμ λ©μμ§λ₯Ό λ³΄λΌ μ μμ΅λλ€. 컀λμ μ΄λ²€νΈ λ°μ μλ¦Όμ μμ μ Notify ν¬νΈ(λ¬Όλ‘ νμ€ν¬κ° μμ κΆνμ κ°μ§κ³ μμ)λ‘ λ³΄λΌ μ μμ΅λλ€.
mach_port_allocate() ν¨μ νΈμΆμ μ ν¬νΈλ₯Ό μμ±νκ³ λ©μμ§ νλ₯Ό μν 곡κ°μ ν λΉν©λλ€. λν ν¬νΈμ λν κΆνμ μλ³ν©λλ€. κ° ν¬νΈ κΆνμ ν΄λΉ ν¬νΈμ μ΄λ¦μ λνλ΄λ©° ν¬νΈμ κΆνμ ν΅ν΄μλ§ μ‘μΈμ€ ν μ μμ΅λλ€. ν¬νΈ μ΄λ¦μ λ¨μν μ μ κ°μ΄λ©° UNIX νμΌ λμ€ν¬λ¦½ν°μ λ§€μ° μ μ¬νκ² μλν©λλ€. λ€μ μμ λ μ΄ APIλ₯Ό μ¬μ©νμ¬ ν¬νΈλ₯Ό μμ±νλ λ°©λ²μ 보μ¬μ€λλ€.
mach port t port; // ν¬νΈ κΆνμ μ΄λ¦
mach port allocate(
mach task self(), // a task referring to itself
MACH PORT RIGHT RECEIVE, // the right for this port
&port); // the name of the port right
κ° νμ€ν¬λ λν λΆνΈμ€νΈλ© ν¬νΈμ μ‘μΈμ€ ν μ μμ΄μ νμ€ν¬κ° μμ±ν ν¬νΈλ₯Ό μμ€ν μ 체μ λΆνΈμ€νΈλ© μλ²μ λ±λ‘ν μ μμ΅λλ€. ν¬νΈκ° λΆνΈμ€νΈλ© μλ²μ λ±λ‘λλ©΄ λ€λ₯Έ νμ€ν¬κ° μ΄ λ μ§μ€νΈλ¦¬μμ ν¬νΈλ₯Ό κ²μνμ¬ ν¬νΈλ‘ λ©μμ§λ₯Ό λ³΄λΌ μ μλ κΆνμ μ»μ μ μμ΅λλ€.
κ° ν¬νΈμ κ΄λ ¨λ νλ ν¬κΈ°κ° μ νλμ΄ μμΌλ©° μ²μμλ λΉμ΄ μμ΅λλ€. λ©μμ§κ° ν¬νΈλ‘ μ μ‘λλ©΄ νμ 볡μ¬λ©λλ€. λͺ¨λ λ©μμ§λ μμ μ μΌλ‘ μ λ¬λλ©° λμΌν μ°μ μμλ₯Ό κ°μ§λλ€. Machλ λμΌν μ‘μ μμ μ¬λ¬ λ©μμ§κ° μ μ μ μΆ(FIFO) μμλ‘ νμ μ½μ νμ§λ§ μ λμ μμλ₯Ό 보μ₯νμ§λ μμ΅λλ€. μλ₯Ό λ€μ΄, λ λͺ μ μ‘μ μκ° λ³΄λΈ λ©μμ§λ μμμ μμλ‘ νμ μ μ₯λ©λλ€.
Mach λ©μμ§μλ λ€μ λ νλλ₯Ό ν¬ν¨ν©λλ€.
- κ³ μ ν¬κΈ°μ λ©μμ§ ν€λ. ν€λλ λ©μμ§ ν¬κΈ°, μμ€ λ° λμ ν¬νΈλ₯Ό ν¬ν¨ν λ©μμ§μ κ΄ν λ©ν λ°μ΄ν°λ₯Ό ν¬ν¨νλ€. μΌλ°μ μΌλ‘ μ‘μ μ€λ λλ μλ΅μ μμνλ―λ‘ μμ€μ ν¬νΈ μ΄λ¦μ΄ μμ νμ€ν¬λ‘ μ λ¬λμ΄ μλ΅μ 보λ΄λ λ° "λ°ν μ£Όμ"λ‘ μ¬μ©ν μ μλ€.
- λ°μ΄ν°λ₯Ό ν¬ν¨νλ κ°λ³ ν¬κΈ° 본체
λ©μμ§λ λ¨μνκ±°λ 볡μ‘ν μ μμ΅λλ€. κ°λ¨ν λ©μμ§λ 컀λμ μν΄ ν΄μλμ§ μλ ꡬ쑰νλμ§ μμ 보ν΅μ μ¬μ©μ λ°μ΄ν°λ₯Ό ν¬ν¨ν©λλ€. 볡μ‘ν λ©μμ§λ "out-of-line" λ°μ΄ν°λ₯Ό ν¬ν¨νλ λ©λͺ¨λ¦¬ μμΉμ λν ν¬μΈν°λ₯Ό ν¬ν¨νκ±°λ λ€λ₯Έ νμ€ν¬μ ν¬νΈ κΆνμ μ μ‘νλ λ° μ¬μ©λ μ μμ΅λλ€. Out-of-line λ°μ΄ν° ν¬μΈν°λ λ©μμ§κ° λ§μ μμ λ°μ΄ν°λ₯Ό μ λ¬ν΄μΌ ν λ νΉν μ μ©ν©λλ€. κ°λ¨ν λ©μμ§λ λ©μμ§μ λ°μ΄ν°λ₯Ό 볡μ¬νκ³ ν¨ν€μ§ν΄μΌ ν©λλ€. Out-of-line λ°μ΄ν° μ μ‘μλ λ°μ΄ν°κ° μ μ₯λ λ©λͺ¨λ¦¬ μμΉλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ§ νμν©λλ€.
mach_msg() ν¨μλ λ©μμ§λ₯Ό 보λ΄κ³ λ°λ νμ€ APIμ λλ€. ν¨μλ 맀κ°λ³μ μ€ νλκ° MACH_SEND_MSG λλ MACH_RCV_MSGκ°μ κ°μ§λ©° μ‘μ λλ μμ μ°μ°μμΈμ§λ₯Ό λνλ λλ€. μ΄μ ν΄λΌμ΄μΈνΈ νμ€ν¬κ° μλ² νμ€ν¬μ κ°λ¨ν λ©μμ§λ₯Ό λ³΄λΌ λ μ¬μ©λλ λ°©λ²μ μ€λͺ νκ² μ΅λλ€. ν΄λΌμ΄μΈνΈ λ° μλ² νμ€ν¬μ κ°κ° μ°κ΄λ λ κ°μ ν¬νΈ(clientμ server)κ° μλ€κ³ κ°μ ν©μλ€. μλ μ½λλ ν΄λΌμ΄μΈνΈ νμ€ν¬κ° ν€λλ₯Ό ꡬμ±νκ³ μλ²λ‘ λ©μμ§λ₯Ό 보λ΄λ κ²λΏλ§ μλλΌ ν΄λΌμ΄μΈνΈκ° λ³΄λΈ λ©μμ§λ₯Ό λ°λ μλ² νμ€ν¬λ₯Ό 보μ¬μ€λλ€.
Machμμ λ©μμ§ μ λ¬μ μ€λͺ νλ μμ νλ‘κ·Έλ¨
#include<mach/mach.h>
struct message {
mach msg header t header; int data;
};
mach port t client;
mach port t server;
/* ν΄λΌμ΄μΈνΈ μ½λ */
struct message message;
// ν€λλ₯Ό ꡬμΆ
message.header.msgh size = sizeof(message);
message.header.msgh remote port = server;
message.header.msgh local port = client;
// λ©μμ§λ₯Ό μ‘μ νλ€.
mach msg(&message.header, // λ©μμ§ ν€λ
MACH_SEND_MSG, // λ©μμ§ μ‘μ
sizeof(message), // μ‘μ λ λ©μμ§ ν¬κΈ°
0, // μμ λ©μμ§μ μ΅λ ν¬κΈ° - νμμμ
MACH_PORT_NULL, // μμ ν¬νΈμ μ΄λ¦ ν¬νΈ μμ νμμμ
MACH_MSG_TIMEOUT_NONE, // νμμμ μ€μ μμ
MACH_PORT_NULL // ν¬νΈ μμ
);
/* μλ² μ½λ */
struct message message;
// λ©μμ§λ₯Ό μμ νλ€.
mach msg(&message.header, // λ©μμ§ ν€λ
MACH_RCV_MSG, // λ©μμ§ μμ
0, // μ‘μ λ λ©μμ§ ν¬κΈ°
sizeof(message), // μμ λ©μμ§μ μ΅λ ν¬κΈ°
server, // μμ ν¬νΈμ μ΄λ¦
MACH_MSG_TIMEOUT_NONE, // νμ μμ μ€μ μμ
MACH_PORT_NULL // ν¬νΈ μμ
);
mach_mag() ν¨μ νΈμΆμ λ©μμ§ μ λ¬μ μννκΈ° μν΄ μ¬μ©μ νλ‘κ·Έλ¨μ μν΄ νΈμΆλ©λλ€. κ·Έλ° λ€μ mach_msg()λ mah_msg_trap() ν¨μλ₯Ό νΈμΆν©λλ€. μ΄λ mah 컀λμ λν μμ€ν μ½μ λλ€. 컀λ λ΄μμ mach_msg_trap()μ mach_msg_overwrite_trap() ν¨μλ₯Ό νΈμΆνμ¬ λ©μμ§μ μ€μ μ λ¬μ μ²λ¦¬ν©λλ€.
μ‘μμ μμ μ체λ μ΅ν΅μ±μ΄ μμ΅λλ€. μλ₯Ό λ€μ΄, λ©μμ§κ° ν¬νΈλ‘ μ μ‘λμμ λ, νκ° κ°λ μ°Όμ μλ μμ΅λλ€. νκ° κ°λ μ°¨μ§ μμΌλ©΄ λ©μμ§κ° νμ 볡μ¬λκ³ μ μ‘ μμ μ΄ κ³μλ©λλ€. ν¬νΈμ νκ° κ°λ μ°¬ κ²½μ° μ‘μ μλ mach_msg()μ 맀κ°λ³μλ₯Ό ν΅ν΄ λ€μ μ€ νλλ₯Ό μ νν μ μμ΅λλ€.
- νμ 곡κ°μ΄ μκΈΈ λκΉμ§ 무기ν κΈ°λ€λ¦°λ€.
- μ΅λ n λ°λ¦¬μ΄ λμ κΈ°λ€λ¦°λ€.
- κΈ°λ€λ¦¬μ§ λ§κ³ μ¦μ 볡κ·νλ€.
- λ©μμ§λ₯Ό μΌμμ μΌλ‘ μΊμ νλ€. λ©μμ§κ° μ μ‘λλ νκ° κ°λ μ°¨λλΌλ μ΄μ체μ μ μ λ¬νμ¬ λ³΄μ‘΄νλ€. λ©μμ§λ₯Ό νμ λ£μ μ μμ λ, ν΅μ§ λ©μμ§κ° μ‘μ μμκ² μ μ‘λλ€. νκ° κ°λ μ°Όμ κ²½μ° μ‘μ μ€λ λλ§λ€ νλμ λ©μμ§λ§ 컀λμ 보κ΄ν μ μλ€.
λ§μ§λ§ 4λ² μ΅μ μ μλ² νμ€ν¬λ₯Ό μν κ²μ λλ€. μμ²μ μλ£ν ν μλ² νμ€ν¬λ μλΉμ€λ₯Ό μμ²ν νμ€ν¬μ μΌνμ± μλ΅μ 보λ΄μΌ ν©λλ€. κ·Έλ¬λ ν΄λΌμ΄μΈνΈμ μλ΅ ν¬νΈκ° κ°λ μ°¬ κ²½μ°μλ λ€λ₯Έ μλΉμ€ μμ²μ κ³μ μλΉμ€ν΄μΌ ν©λλ€.
λ©μμ§ μμ€ν μ μ£Όμ λ¬Έμ μ μ μΌλ°μ μΌλ‘ μ‘μ μμ ν¬νΈμμ μμ μμ ν¬νΈλ‘ λ©μμ§λ₯Ό 볡μ¬ν΄μΌ νλ―λ‘ λ°μνλ μ±λ₯ μ νμ λλ€. Mach λ©μμ§ μμ€ν μ κ°μ λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°μ μ μ¬μ©νμ¬ λ³΅μ¬ μ°μ°μ νΌνλ €κ³ ν©λλ€. κΈ°λ³Έμ μΌλ‘ Machλ μ‘μ μμ λ©μμ§κ° ν¬ν¨λ μ£Όμ 곡κ°μ μμ μμ μ£Όμ 곡κ°μ 맀νν©λλ€. λ°λΌμ μ‘μ μμ μμ μ λͺ¨λ λμΌν λ©λͺ¨λ¦¬μ μ‘μΈμ€ νλ―λ‘ λ©μμ§ μ체λ μ€μ λ‘ λ³΅μ¬λμ§ μμ΅λλ€. μ΄ λ©μμ§ κ΄λ¦¬ κΈ°μ μ μ±λ₯μ ν¬κ² ν₯μμν€μ§λ§ κ°μ μμ€ν λ΄ λ©μμ§μλ§ μλν©λλ€.
3. Windows
Windows μ΄μ체μ λ λͺ¨λνλ₯Ό μ΄μ©νμ¬ κΈ°λ₯μ ν₯μμν€κ³ μλ‘μ΄ κΈ°λ₯μ ꡬννλ μκ°μ κ°μμν¨ μ΅μ μ€κ³μ μμ λλ€. Windowsλ λ€μ€ μ΄μ νκ²½ λλ μλΈμμ€ν μ μ§μνλ©°, μμ© νλ‘κ·Έλ¨μ λ©μμ§ μ λ¬ κΈ°λ²μ ν΅ν΄ μ΄λ€κ³Ό ν΅μ ν©λλ€. λ°λΌμ μμ© νλ‘κ·Έλ¨μ μλΈ μμ€ν μλ²μ ν΄λΌμ΄μΈνΈλ‘ κ°μ£Όν μ μμ΅λλ€.
Windowsμ λ©μμ§ μ λ¬ μ€λΉλ κ³ κΈ λ‘컬 νλ‘μμ νΈμΆ μ€λΉ(advanced local procedure call facility, ALPC)λΌ λΆλ¦½λλ€. ALPCλ λμΌ κΈ°κ³μμ μλ λ νλ‘μΈμ€ κ°μ ν΅μ μ μ¬μ©ν©λλ€. μ΄κ²μ λ리 μ¬μ©λλ νμ€ μ격 νλ‘μμ νΈμΆ(RPC) κΈ°λ²κ³Ό κ°μΌλ, Windowsμ λ§κ² νΉλ³ν μ΅μ νλμμ΅λλ€. Machμ μ μ¬νκ², Windowsλ λ νλ‘μΈμ€ κ°μ μ°κ²°μ ꡬμΆνκ³ μ μ§νκΈ° μν΄ ν¬νΈ κ°μ²΄λ₯Ό μ¬μ©ν©λλ€. Windowsλ μ°κ²° ν¬νΈ(connection port)μ λ κ°μ§ μ νμ ν¬νΈλ₯Ό μ¬μ©ν©λλ€.
μλ² νλ‘μΈμ€λ λͺ¨λ νλ‘μΈμ€κ° μ κ·Όν μ μλ μ°κ²° ν¬νΈ κ°μ²΄λ₯Ό 곡νν©λλ€. ν΄λΌμ΄μΈνΈκ° μλΈμμ€ν μΌλ‘λΆν° μλΉμ€λ₯Ό μν κ²½μ°, μλ²μ μ°κ²° ν¬νΈ κ°μ²΄μ λν νΈλ€μ μ΄κ³ μ°κ²° μμ²μ 보λ λλ€. κ·Έλ¬λ©΄ μλ²λ μ±λμ μμ±νκ³ νΈλ€μ ν΄λΌμ΄μΈνΈμκ² λ°νν©λλ€. μ±λμ ν μμ μ¬μ μΈ ν΅μ ν¬νΈλ‘ ꡬμ±λλλ°, νλλ ν΄λΌμ΄μΈνΈμμ μλ²λ‘ λ©μμ§λ₯Ό 보λ΄κΈ° μν ν¬νΈμ΄κ³ λ€λ₯Έ νλλ μλ²μμ ν΄λΌμ΄μΈνΈλ‘ λ©μμ§λ₯Ό 보λ΄κΈ° μν ν¬νΈμ λλ€. μΆκ°μ μΌλ‘ ν΅μ μ±λμ ν΄λΌμ΄μΈνΈμ μλ²κ° μλ΅ λ©μμ§λ₯Ό κΈ°λ€λ¦¬κ³ μλ λμμλ λ€λ₯Έ μμ²μ λ°μλ€μΌ μ μλλ‘ μ½λ°± κΈ°λ²μ μ 곡ν©λλ€.
ALPC μ±λμ΄ μμ±λλ©΄ λ€μ 3κ°μ§ μ€ νλμ λ©μμ§ μ λ¬ κΈ°λ²μ νλκ° μ νλ©λλ€.
- 256λ°μ΄νΈκΉμ§μ μμ λ©μμ§μ κ²½μ°, ν¬νΈμ λ©μμ§ νκ° μ€κ° μ μ₯μλ‘ μ¬μ©λκ³ , λ©μμ§λ νλ‘μΈμ€μμ νλ‘μΈμ€λ‘ 볡μ¬λλ€.
- λμ©λ λ©μμ§λ λ°λμ μΉμ κ°μ²΄(section object)λ₯Ό ν΅νμ¬ μ λ¬λμ΄μΌ νλ€. μΉμ κ°μ²΄λ μ±λκ³Ό μ°κ΄λ 곡μ λ©λͺ¨λ¦¬μ μμμ λ§νλ€.
- λ°μ΄ν°μ μμ΄ λ무 λ§μμ μΉμ κ°μ²΄μ μ μ₯λ μ μλ κ²½μ°, μλ² νλ‘μΈμ€κ° ν΄λΌμ΄μΈνΈμ μ£Όμ 곡κ°μ μ§μ μ½κ±°λ μΈ μ μλ APIλ₯Ό μ¬μ©ν μ μλ€.
ν΄λΌμ΄μΈνΈλ μ±λμ μ€μ ν λ λμ©λ λ©μμ§ μ μ‘μ΄ νμνμ§ κ²°μ ν΄μΌλ§ ν©λλ€. ν΄λΌμ΄μΈνΈκ° λμ©λ λ©μμ§λ₯Ό 보λ΄μΌ νλ€κ³ κ²°μ νλ©΄ μΉμ κ°μ²΄μ μμ±μ μμ²ν©λλ€. λ§μ°¬κ°μ§λ‘, μλ²μ μλ΅ λ©μμ§κ° λμ©λμ΄λΌκ³ μμλλ©΄ μλ²κ° μΉμ κ°μ²΄λ₯Ό μμ±ν©λλ€. μΉμ κ°μ²΄λ₯Ό μ¬μ©νλ €λ©΄ μΉμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ ν¬μΈν°μ ν¬κΈ°μ κ΄ν μ 보λ₯Ό λ΄κ³ μλ μμ λ©μμ§κ° μ μ‘λ©λλ€. μ΄ λ°©λ²μ μμμ λμ΄ν 첫 λ²μ§Έ λ°©λ²λ³΄λ€ 볡μ‘νμ§λ§ λ°μ΄ν° 볡μ¬κ° λ°μνμ§ μμ΅λλ€. Windowsμ κ³ κΈ μ§μ νλ‘μμ νΈμΆμ κ΅¬μ‘°κ° μλ μ΄λ―Έμ§μ λμ μμ΅λλ€.
Windowsμ κ³ κΈ λ‘컬 νλ‘μμ νΈμΆ μ€λΉλ Windows APIμ λΆλΆμ΄ μλκΈ° λλ¬Έμ μμ© νλ‘κ·Έλλ¨Έλ μ¬μ©ν μ μλ€λ μ¬μ€μ μ£Όμν΄μΌ ν©λλ€. Windows APIλ₯Ό μ¬μ©νλ μμ©μ νμ€ μ격 νλ‘μμ νΈμΆμ λΆλ¦ λλ€. κ°μ μμ€ν μμ μ‘΄μ¬νλ νλ‘μΈμ€μ RPCκ° νΈμΆλλ©΄ μ΄ RPCλ κ°μ μ μΌλ‘ κ³ κΈ λ‘컬 νλ‘μμ νΈμΆμ ν΅νμ¬ μ²λ¦¬λ©λλ€. λν λ§μ 컀λ μλΉμ€λ€μ ν΄λΌμ΄μΈνΈ νλ‘μΈμ€μ ν΅μ νκΈ° μνμ¬ ALPCλ₯Ό μ¬μ©ν©λλ€.
4. νμ΄ν(Pipes)
νμ΄νλ λ νλ‘μΈμ€κ° ν΅μ ν μ μκ² νλ μ λ¬μλ‘μ λμν©λλ€. νμ΄νλ μ΄κΈ° UNIX μμ€ν μμ μ 곡νλ IPC κΈ°λ²μ νλμμ΅λλ€. νμ΄νλ ν΅μ νλ‘μΈμ€ κ°μ ν΅μ νλ λ κ°λ¨ν λ°©λ²μ νλμ΄μ§λ§ ν΅μ ν λ μ¬λ¬ μ μ½μ ν©λλ€. νμ΄νλ₯Ό ꡬννκΈ° μν΄μλ λ€μ 4κ°μ§ λ¬Έμ λ₯Ό κ³ λ €ν΄μΌ ν©λλ€.
- νμ΄νκ° λ¨λ°©ν₯ ν΅μ λλ μλ°©ν₯ ν΅μ μ νμ©νλκ°?
- μλ°©ν₯ ν΅μ μ΄ νμ©λλ€λ©΄ λ°μ΄μ€(half duplex) λ°©μμΈκ°, μ μ΄μ€(full duplex) λ°©μμΈκ°? λ°μ΄μ€ λ°μμ νμκ°μ ν λ°©ν₯ μ μ‘λ§ κ°λ₯νκ³ μ μ΄μ€ λ°©μμ λμμ μλ°©ν₯ λ°μ΄ν° μ μ‘μ΄ κ°λ₯νλ€.
- ν΅μ νλ λ νλ‘μΈμ€ κ°μ λΆλͺ¨-μμκ³Ό κ°μ νΉμ κ΄κ³κ° μ‘΄μ¬ν΄μΌλ§ νλκ°?
- νμ΄νλ λ€νΈμν¬λ₯Ό ν΅νμ¬ ν΅μ μ΄ κ°λ₯νκ°, μλλ©΄ λμΌν κΈ°κ³ μμ μ‘΄μ¬νλ λ νλ‘μΈμ€λΌλ¦¬λ§ ν΅μ ν μ μλκ°?
μλμμ UNIXμ Windows μμ€ν μμ μ¬μ©λλ μΌλ° νμ΄νμ μ§λͺ νμ΄νμ λ κ°μ§ μ νμ νμ΄νμ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
(1) μΌλ° νμ΄ν(Ordinary Pipes)
μΌλ° νμ΄νλ μμ°μ-μλΉμ ννλ‘ λ νλ‘μΈμ€ κ°μ ν΅μ μ νμ©ν©λλ€. μμ°μλ νμ΄νμ ν μ’ λ¨(μ°κΈ° μ’ λ¨)μ μ°κ³ , μλΉμλ λ€λ₯Έ μ’ λ¨(μ½κΈ° μ’ λ¨)μμ μ½μ΅λλ€. κ²°κ³Όμ μΌλ‘ μΌλ° νμ΄νλ νμͺ½μΌλ‘λ§ λ°μ΄ν°λ₯Ό μ μ‘ν μ μμΌλ©° μ€μ§ λ¨λ°©ν₯ ν΅μ λ§μ κ°λ₯νκ² ν©λλ€. λ§μΌ μλ°©ν₯ ν΅μ μ΄ νμνλ€λ©΄ κ°κ° λ€λ₯Έ λ°©ν₯μΌλ‘ λ°μ΄ν°λ₯Ό μ μ‘ν μ μλ λ κ°μ νμ΄νλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. λ€μμΌλ‘ UNIXμ Windows μμ€ν μμ μΌλ° νμ΄νλ₯Ό ꡬμΆνλ μλ₯Ό μ€λͺ ν©λλ€. λ κ°μ νλ‘κ·Έλ¨ μμ μμ ν νλ‘μΈμ€λ GreetingsλΌλ λ©μμ§λ₯Ό νμ΄νμ μ°κ³ , λ€λ₯Έ νλ‘μΈμ€λ μ΄ λ©μμ§λ₯Ό νμ΄νλ‘λΆν° μ½μ΅λλ€.
UNIX μμ€ν μμ μΌλ° νμ΄νλ λ€μ ν¨μλ₯Ό μ¬μ©νμ¬ κ΅¬μΆλ©λλ€.
pipe(int fd[])
μ΄ ν¨μλ fd[] νμΌ μ€λͺ μλ₯Ό ν΅ν΄ μ κ·Όλλ νμ΄νλ₯Ό μμ±ν©λλ€. fd[0]λ νμ΄νμ μ½κΈ° μ’ λ¨μ΄κ³ fd[1]μ νμ΄νμ μ°κΈ° μ’ λ¨μΌλ‘ λμν©λλ€. UNIXλ νμ΄νλ₯Ό νμΌμ νΉμν μ νμΌλ‘ μ·¨κΈν©λλ€. λ°λΌμ νμ΄νλ μΌλ°μ μΈ read()μ write() μμ€ν μ½μ μ¬μ©νμ¬ μ κ·Όλ μ μμ΅λλ€.
μΌλ° νμ΄νλ νμ΄νλ₯Ό μμ±ν νλ‘μΈμ€ μ΄μΈμλ μ κ·Όν μ μμ΅λλ€. λ°λΌμ ν΅μ° λΆλͺ¨ νλ‘μΈμ€κ° νμ΄νλ₯Ό μμ±νκ³ fork()λ‘ μμ±ν μμ νλ‘μΈμ€μ ν΅μ νκΈ° μν΄ μ¬μ©ν©λλ€. νμ΄νλ νμΌμ νΉμν μ νμ΄κΈ° λλ¬Έμ μμ νλ‘μΈμ€λ λΆλͺ¨λ‘λΆν° νμ΄νλ₯Ό μμλ°μ΅λλ€. μλ μ΄λ―Έμ§λ fd λ°°μ΄μ νμΌ λμ€ν¬λ¦½ν°μ λΆλͺ¨ λ° μμ νλ‘μΈμ€μ κ΄κ³λ₯Ό 보μ¬μ€λλ€.
μ μ΄λ―Έμ§μμ 보λ―μ΄ λΆλͺ¨κ° νμ΄νμ μ°κΈ° μ’ λ¨(fd[1])μ λ°μ΄ν°λ₯Ό μ°λ©΄ νμ΄νμ μ½κΈ° μ’ λ¨(fd[0])μμ μμμ΄ μ½μ μ μμ΅λλ€.
UNIXμ μΌλ° νμ΄ν
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define BUFFER SIZE 25
#define READ END 0
#define WRITE END 1
int main(void)
{
char write msg[BUFFER SIZE] = "Greetings";
char read msg[BUFFER SIZE];
int fd[2];
pid t pid;
/* create the pipe */
if (pipe(fd) == -1) {
fprintf(stderr,"Pipe failed");
return 1;
}
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
return 1;
}
if (pid > 0) { /* parent process */
/* close the unused end of the pipe */
close(fd[READ END]);
/* write to the pipe */
write(fd[WRITE END], write msg, strlen(write msg)+1);
/* close the write end of the pipe */
close(fd[WRITE END]);
}
else { /* child process */
/* close the unused end of the pipe */
close(fd[WRITE END]);
/* read from the pipe */
read(fd[READ END], read msg, BUFFER SIZE);
printf("read %s",read msg);
/* close the read end of the pipe */
close(fd[READ END]);
}
return 0;
}
μ μ½λμμ λ³΄μΈ UNIX νλ‘κ·Έλ¨μμ λΆλͺ¨ νλ‘μΈμ€λ νμ΄νλ₯Ό μμ±νκ³ μμ νλ‘μΈμ€λ₯Ό μμ±νκΈ° μνμ¬ fork()λ₯Ό νΈμΆν©λλ€. fork() νμ μΌμ΄λλ μμ μ νμ΄νλ₯Ό ν΅ν΄ λ°μ΄ν°κ° μ΄λ»κ² νλ¬κ°λλμ λ°λΌ λ¬λΌμ§λλ€. μ΄ μμ μμλ λΆλͺ¨ νλ‘μΈμ€κ° νμ΄νμ μ°κ³ , μμ νλ‘μΈμ€κ° νμ΄νλ‘λΆν° μ½μ΅λλ€. λΆλͺ¨μ μμ νλ‘μΈμ€ λͺ¨λ μ²μμ μμ λ€μ΄ μ¬μ©νμ§ μλ νμ΄νμ μ’ λ¨μ λ«λ κ²μ μ£Όμν΄μΌ ν©λλ€. μ μ½λμ λ³΄μΈ νλ‘κ·Έλ¨μ μ΄λ¬ν μμ μ νμ§λ μμ§λ§ writerκ° νμ΄νμ μ’ λ¨μ λ«μμ λ, νμ΄νλ‘λΆν° μ½λ νλ‘μΈμ€κ° end-of-file (reade()κ° 0μ λ°ν)μ νμ§νλ κ²μ 보μ₯νκΈ° λλ¬Έμ μ΄ μμ μ λ§€μ° μ€μν μ μ°¨μ λλ€.
Windows μμ€ν μ μΌλ° νμ΄νλ μ΅λͺ νμ΄ν(anonynous pipe)λΌκ³ λΆλ¦¬λ©° UNIXμ λμλλ νμ΄νμ μ μ¬νκ² λμν©λλ€. μ΄ νμ΄νλ λ¨λ°©ν₯μ΄κ³ ν΅μ νλ λ νλ‘μΈμ€λ λΆλͺ¨-μμ κ΄κ³μ¬μΌ ν©λλ€. κ²λ€κ° νμ΄νμ μ½κΈ°μ μ°κΈ°λ 보ν΅μ Read-File()κ³Ό WriteFile()μ μ¬μ©νμ¬ μ΄λ£¨μ΄μ§λλ€. νμ΄νλ₯Ό μμ±νκΈ° μν Windows APIλ CreatePipe() ν¨μλ‘μ 5κ°μ 맀κ°λ³μλ₯Ό μ λ¬λ°μ΅λλ€. 맀κ°λ³μλ (1) μ½κΈ°, (2) μ°κΈ°, (3) μμ νλ‘μΈμ€κ° νμ΄νμ νΈλ€μ μμλ°λλ€λ κ²μ λͺ μνκΈ° μν΄ μ¬μ©λλ STARTUPINFO ꡬ쑰체μ μΈμ€ν΄μ€λ₯Ό μν κ°κ°μ νΈλ€μ μ λ¬λ°μ΅λλ€. κ·Έλ¦¬κ³ (4) λ°μ΄νΈ λ¨μμ νμ΄νμ ν¬κΈ°κ° μ§μ λ μ μμ΅λλ€.
Windows μ΅λͺ νμ΄ν-λΆλͺ¨ νλ‘μΈμ€
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define BUFFER SIZE 25
int main(VOID){
HANDLE ReadHandle, WriteHandle;
STARTUPINFO si;
PROCESS INFORMATION pi;
char message[BUFFER SIZE] = "Greetings";
DWORD written;
/* set up security attributes allowing pipes to be inherited */
SECURITY ATTRIBUTES sa = {sizeof(SECURITY ATTRIBUTES),NULL,TRUE};
/* allocate memory */
ZeroMemory(&pi, sizeof(pi));
/* create the pipe */
if (!CreatePipe(&ReadHandle, &WriteHandle, &sa, 0)) {
fprintf(stderr, "Create Pipe Failed");
return 1;
}
/* establish the START INFO structure for the child process */
GetStartupInfo(&si);
si.hStdOutput = GetStdHandle(STD OUTPUT HANDLE);
/* redirect standard input to the read end of the pipe */
si.hStdInput = ReadHandle;
si.dwFlags = STARTF USESTDHANDLES;
/* don’t allow the child to inherit the write end of pipe */
SetHandleInformation(WriteHandle, HANDLE FLAG INHERIT, 0);
/* create the child process */
CreateProcess(NULL, "child.exe", NULL, NULL,
TRUE, /* inherit handles */
0, NULL, NULL, &si, &pi);
/* close the unused end of the pipe */
CloseHandle(ReadHandle);
/* the parent writes to the pipe */
if (!WriteFile(WriteHandle, message,BUFFER SIZE,&written,NULL))
fprintf(stderr, "Error writing to pipe.");
/* close the write end of the pipe */
CloseHandle(WriteHandle);
/* wait for the child to exit */
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
μ μ½λλ μμ νλ‘μΈμ€μ ν΅μ νκΈ° μνμ¬ μ΅λͺ νμ΄νλ₯Ό μμ±νλ λΆλͺ¨ νλ‘μΈμ€λ₯Ό μ€λͺ νκ³ μμ΅λλ€. μμ νλ‘μΈμ€κ° λΆλͺ¨ νλ‘μΈμ€κ° μμ±ν νμ΄νλ₯Ό μλμΌλ‘ μμλ°λ UNIX μμ€ν κ³Όλ λ€λ₯΄κ² Windowsμμλ νλ‘κ·Έλλ¨Έκ° μ΄λ€ μμ±μ μμλ°λμ§λ₯Ό λͺ μν΄μΌ ν©λλ€. μ°μ νΈλ€μ μμλ°μ μ μλλ‘ SECURITY_ATTRIBUTES ꡬ쑰λ₯Ό μ΄κΈ°ννκ³ λ€μμ μμ νλ‘μΈμ€μ νμ€ μ λ ₯ λλ νμ€ μΆλ ₯ νΈλ€μ νμ΄νμ μ½κΈ° λλ μ°κΈ° νΈλ€λ‘ μ¬μ§μ ν΄μΌ ν©λλ€. μμ νλ‘μΈμ€κ° νμ΄νλ‘λΆν° μ½λλ‘ λ§λ€μ΄μΌ νκΈ° λλ¬Έμ λΆλͺ¨ νλ‘μΈμ€λ μμμ νμ€ μ λ ₯μ νμ΄νμ μ½κΈ° νΈλ€λ‘ μ¬μ§μ ν΄μΌλ§ ν©λλ€. λμ±μ΄ νμ΄νλ λ°μ΄μ€ λ°©μμ΄λ―λ‘ μμμ΄ νμ΄νμ μ°κΈ° μ’ λ¨μ μμλ°λ κ²μ κΈμ§μμΌμΌ ν©λλ€. νμ΄νμ μ°κΈ° μ μ λΆλͺ¨λ λ¨Όμ νμ΄νμ μ¬μ©νμ§ μμ μ½κΈ° μ’ λ¨μ λ«μ΅λλ€. νμ΄νλ‘λΆν° μ½λ μμ νλ‘μΈμ€λ μλμ μ½λμ λμ μμ΅λλ€. νμ΄νλ‘λΆν° μ½κΈ° μ μ μ΄ νλ‘κ·Έλ¨μ GetStdHandle() ν¨μλ₯Ό νΈμΆνμ¬ νμ΄νμ μ½κΈ° νΈλ€μ νλν©λλ€.
Windows μ΅λͺ νμ΄ν-μμ νλ‘μΈμ€
#include <stdio.h>
#include <windows.h>
#define BUFFER SIZE 25
int main(VOID)
{
HANDLE Readhandle;
CHAR buffer[BUFFER SIZE]; DWORD read;
/* get the read handle of the pipe */
ReadHandle = GetStdHandle(STD INPUT HANDLE);
/* the child reads from the pipe */
if (ReadFile(ReadHandle, buffer, BUFFER SIZE, &read, NULL))
printf("child read %s",buffer);
else
fprintf(stderr, "Error reading from pipe");
return 0;
}
UNIXμ Windows μμ€ν λͺ¨λμμ ν΅μ νλ λ νλ‘μΈμ€λ λΆλͺ¨-μμ κ΄κ³λ₯Ό κ°μ ΈμΌ νλ€λ κ²μ λͺ μ¬νμ¬μΌ ν©λλ€. μ΄ μ νμ νμ΄νλ λμΌν κΈ°κ³μμ λ νλ‘μΈμ€λΌλ¦¬λ§ ν΅μ μ΄ κ°λ₯νλ€λ κ²μ μλ―Έν©λλ€.
(2) μ§λͺ νμ΄ν(Named Pipes)
μΌλ° νμ΄νλ ν μμ νλ‘μΈμ€κ° ν΅μ ν μ μλ κ°λ¨ν κΈ°λ²μ μ 곡ν©λλ€. κ·Έλ¬λ μΌλ° νμ΄νλ μ€λ‘μ§ νλ‘μΈμ€λ€μ΄ μλ‘ ν΅μ νλ λμμλ§ μ‘΄μ¬ν©λλ€. UNIXμ Windowsμμ€ν λͺ¨λμμ νλ‘μΈμ€λ€μ΄ ν΅μ μ λ§μΉκ³ μ’ λ£νλ©΄ μΌλ° νμ΄νλ μμ΄μ§κ² λ©λλ€.
μ§λͺ νμ΄ν(named pipes)λ μ’ λ κ°λ ₯ν ν΅μ λꡬλ₯Ό μ 곡ν©λλ€. ν΅μ μ μλ°©ν₯μΌλ‘ κ°λ₯νλ©° λΆλͺ¨-μμ κ΄κ³λ νμλ‘ νμ§ μμ΅λλ€. μ§λͺ νμ΄νκ° κ΅¬μΆλλ©΄ μ¬λ¬ νλ‘μΈμ€λ€μ΄ μ΄λ₯Ό μ¬μ©νμ¬ ν΅μ ν μ μμ΅λλ€. μ€μ ν΅μμ μλ리μ€μμ μ§λͺ νμ΄νλ λ€μμ writerλ₯Ό κ°μ§λλ€. μΆκ°λ‘ ν΅μ νλ‘μΈμ€κ° μ’ λ£νλλΌλ μ§λͺ νμ΄νλ κ³μ μ‘΄μ¬νκ² λ©λλ€. UNIXμ Windows μμ€ν μ ꡬνμμ μ°¨μ΄μ μ μμ§λ§ λͺ¨λ μ§λͺ νμ΄νλ₯Ό μ§μν©λλ€. λ€μμΌλ‘ κ° μμ€ν μ μ§λͺ νμ΄νλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μ§λͺ νμ΄νλ₯Ό UNIXμμλ FIFOλΌκ³ λΆλ¦ λλ€. μμ±λλ©΄ μ§λͺ νμ΄νλ νμΌ μμ€ν μ λ³΄ν΅ νμΌμ²λΌ μ‘΄μ¬ν©λλ€. FIFOλ mkfifo() μμ€ν μ½μ μ΄μ©νμ¬ μμ±λκ³ μΌλ°μ μΈ open(), read(), write(), λ° close() μμ€ν μ½λ‘ μ‘°μλ©λλ€. λͺ μμ μΌλ‘ νμΌ μμ€ν μμ μμ λ λκΉμ§ μ‘΄μ¬νκ² λ©λλ€. FIFOκ° μλ°©ν₯ ν΅μ μ νμ©νκΈ°λ νμ§λ§ λ°μ΄μ€ μ μ‘λ§μ΄ κ°λ₯ν©λλ€. λ°μ΄ν°κ° μλ°©ν₯μΌλ‘ μ μ‘λ νμκ° μλ€λ©΄, λ³΄ν΅ 2κ°μ FIFOκ° μ¬μ©λ©λλ€. λΆκ°μ μΌλ‘ ν΅μ νλ λ νλ‘μΈμ€λ λμΌν κΈ°κ³ λ΄μ μ‘΄μ¬ν΄μΌ ν©λλ€. μλ‘ λ€λ₯Έ κΈ°κ³μ μ‘΄μ¬νλ νλ‘μΈμ€ μ¬μ΄μ ν΅μ μ΄ νμνλ€λ©΄ μμΌμ μ¬μ©ν΄μΌ ν©λλ€.
Windows μμ€ν μ μ§λͺ νμ΄νλ UNIXμ μμ νμ΄νλ³΄λ€ ν¨μ¬ νλΆν ν΅μ κΈ°λ²μ μ 곡ν©λλ€. μ μ΄μ€ ν΅μ μ νμ©νλ©°, ν΅μ νλ λ νλ‘μΈμ€λ κ°μ κΈ°κ³ λλ λ€λ₯Έ κΈ°κ³μμ μ‘΄μ¬ν μ μμ΅λλ€. μΆκ°λ‘ UNIX FIFOκ° λ°μ΄νΈ-λ¨μ ν΅μ λ§μ νμ©νλ κ²κ³Ό λΉκ΅ν΄ Windows μμ€ν νμ΄νλ λ°μ΄νΈ-λ¨μ λλ λ©μμ§-λ¨μ λ°μ΄ν°μ μ μ‘μ νμ©ν©λλ€. μ§λͺ νμ΄νλ CreateNamePipe() ν¨μλ₯Ό μ¬μ©νμ¬ μμ±λκ³ ν΄λΌμ΄μΈνΈλ ConnectNamedPipe() ν¨μλ₯Ό μ¬μ©νμ¬ μ§λͺ νμ΄νμ μ°κ²°ν μ μμ΅λλ€. μ§λͺ νμ΄νλ₯Ό ν΅ν ν΅μ μ ReadFile()κ³Ό WriteFile() ν¨μλ₯Ό μ¬μ©νμ¬ μ€νλ©λλ€.
'ComputerScience π > μ΄μ체μ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[OS] CPU μ€μΌμ€λ§(CPU Scheduling) (0) | 2022.02.20 |
---|---|
[OS] μ€λ λ ν(thread pool) (0) | 2022.02.14 |
[OS] μ€λ λμ λμμ±(Thread & Concurrency) (0) | 2022.02.14 |
[OS] νλ‘μΈμ€ κ° ν΅μ (Interprocess Communication, IPC) (0) | 2022.02.10 |
[OS] νλ‘μΈμ€μ κ°λ (Process Concept) (0) | 2022.02.08 |
[OS] macOS, iOS μ Android μ΄μ체μ (0) | 2022.02.06 |
λκΈ