[Daily morning study] IPC (Inter-Process Communication) λ°©λ²λ€
#daily morning study
IPCλ?
νλ‘μΈμ€λ κΈ°λ³Έμ μΌλ‘ λ 립λ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§κΈ° λλ¬Έμ μλ‘μ λ°μ΄ν°μ μ§μ μ κ·Όν μ μλ€. IPC(Inter-Process Communication)λ μ΄λ κ² κ²©λ¦¬λ νλ‘μΈμ€λ€μ΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°κ±°λ λμμ μ‘°μ¨ν μ μλλ‘ OSκ° μ 곡νλ λ©μ»€λμ¦μ΄λ€.
IPCκ° νμν μν©:
- μ¬λ¬ νλ‘μΈμ€κ° νλ ₯ν΄μ νλμ μμ μ μ²λ¦¬ν λ
- μμ°μ-μλΉμ(Producer-Consumer) ꡬ쑰μ²λΌ λ°μ΄ν°λ₯Ό λκ²¨μΌ ν λ
- νλ‘μΈμ€ κ° μ΄λ²€νΈλ μκ·Έλμ μ λ¬ν΄μΌ ν λ
μ£Όμ IPC λ°©μ
1. νμ΄ν (Pipe)
λ¨λ°©ν₯ λ°μ΄ν° μ€νΈλ¦Ό. λΆλͺ¨-μμ νλ‘μΈμ€μ²λΌ κ΄λ ¨λ νλ‘μΈμ€ μ¬μ΄μμ μ£Όλ‘ μ¬μ©νλ€.
# μ
Έμμ μ°λ νμ΄νλ λμΌν μ리
ls -l | grep ".md"
int fd[2];
pipe(fd); // fd[0]: μ½κΈ° λ, fd[1]: μ°κΈ° λ
if (fork() == 0) {
// μμ: μ°κΈ°
close(fd[0]);
write(fd[1], "hello", 5);
} else {
// λΆλͺ¨: μ½κΈ°
close(fd[1]);
char buf[10];
read(fd[0], buf, 5);
}
νΉμ§:
- λ¨λ°©ν₯ (μλ°©ν₯μ΄ νμνλ©΄ νμ΄ν 2κ° μ¬μ©)
- κ΄λ ¨ μλ νλ‘μΈμ€ κ°μλ μ¬μ© λΆκ° β μ΄ κ²½μ° Named Pipe(FIFO) μ¬μ©
2. Named Pipe (FIFO)
μΌλ° νμ΄νμ λ¬λ¦¬ νμΌ μμ€ν μ μ΄λ¦μ΄ μλ νμ΄ν. κ΄κ³μλ νλ‘μΈμ€λΌλ¦¬λ μ΄λ¦μΌλ‘ μ°Ύμμ ν΅μ κ°λ₯νλ€.
mkfifo /tmp/my_pipe
# νλ‘μΈμ€ A: μ°κΈ°
echo "data" > /tmp/my_pipe
# νλ‘μΈμ€ B: μ½κΈ°
cat /tmp/my_pipe
3. λ©μμ§ ν (Message Queue)
λ©μμ§λ₯Ό νμ μ μ₯νκ³ , μμ μκ° κΊΌλ΄κ°λ λ°©μ. μ‘μ μμ μμ μκ° λμμ μ€ν μ€μΌ νμκ° μλ€λ μ μ΄ νμ΄νμ λ€λ₯΄λ€.
| νλͺ© | νμ΄ν | λ©μμ§ ν |
|---|---|---|
| λ°©ν₯ | λ¨λ°©ν₯ | μλ°©ν₯ κ°λ₯ |
| λκΈ°ν | λκΈ° | λΉλκΈ° |
| λ©μμ§ λ¨μ | λ°μ΄νΈ μ€νΈλ¦Ό | νμ μλ λ©μμ§ |
// λ©μμ§ ν μμ±/μ κ·Ό
int msgid = msgget(key, IPC_CREAT | 0666);
// μ‘μ
msgsnd(msgid, &msg, sizeof(msg.text), 0);
// μμ
msgrcv(msgid, &msg, sizeof(msg.text), 1, 0);
4. 곡μ λ©λͺ¨λ¦¬ (Shared Memory)
μ¬λ¬ νλ‘μΈμ€κ° λμΌν λ©λͺ¨λ¦¬ μμμ μ§μ μ½κ³ μ°λ λ°©μ. IPC λ°©λ² μ€ κ°μ₯ λΉ λ₯΄λ€.
νλ‘μΈμ€ Aμ κ°μ μ£Όμ κ³΅κ° νλ‘μΈμ€ Bμ κ°μ μ£Όμ 곡κ°
ββββββββββββββββββββ ββββββββββββββββββββ
β μ½λ β β μ½λ β
β μ€ν β β μ€ν β
β 곡μ λ©λͺ¨λ¦¬ βββΌββββββββββββΌββ 곡μ λ©λͺ¨λ¦¬ β
ββββββββββββββββββββ ββββββββββββββββββββ
β β
ββββββββ 물리 λ©λͺ¨λ¦¬ ββββββ
μλκ° λΉ λ₯Έ λμ λκΈ°ν λ¬Έμ κ° λ°μν μ μμ΄μ Semaphoreλ Mutexμ ν¨κ» μ¨μΌ νλ€.
// 곡μ λ©λͺ¨λ¦¬ μμ±
int shmid = shmget(key, 1024, IPC_CREAT | 0666);
// νλ‘μΈμ€ μ£Όμ 곡κ°μ μ°κ²°
char *data = (char *)shmat(shmid, NULL, 0);
// μ½κΈ°/μ°κΈ°
sprintf(data, "shared data");
// μ°κ²° ν΄μ
shmdt(data);
5. μμΌ (Socket)
λ€νΈμν¬ ν΅μ μ μ°μ΄λ μμΌμ κ°μ λ¨Έμ λ΄ νλ‘μΈμ€ κ° ν΅μ μλ μ¬μ©ν μ μλ€. Unix Domain Socketμ μ°λ©΄ λ€νΈμν¬ μ€νμ κ±°μΉμ§ μμ λΉ λ₯΄λ€.
# Unix Domain Socket μμ (Python)
import socket
# μλ²
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind("/tmp/my.sock")
server.listen(1)
conn, _ = server.accept()
data = conn.recv(1024)
# ν΄λΌμ΄μΈνΈ
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect("/tmp/my.sock")
client.send(b"hello")
TCP/UDP μμΌκ³Ό λ¬λ¦¬ νμΌ μμ€ν κ²½λ‘λ‘ μ°κ²°νκΈ° λλ¬Έμ κ°μ νΈμ€νΈ μμμλ§ λμνλ€.
6. μκ·Έλ (Signal)
λ°μ΄ν°λ₯Ό μ λ¬νλ κ² μλλΌ μ΄λ²€νΈ λ°μμ μ리λ μ©λ. λΉλκΈ°μ μΌλ‘ μ λ¬λλ€.
kill -9 1234 # PID 1234 νλ‘μΈμ€μ SIGKILL μ μ‘
kill -15 1234 # SIGTERM (μ μ μ’
λ£ μμ²)
#include <signal.h>
void handler(int sig) {
printf("Received signal: %d\n", sig);
}
signal(SIGINT, handler); // Ctrl+C μ
λ ₯ μ handler μ€ν
μμ£Ό μ°λ μκ·Έλ:
| μκ·Έλ | λ²νΈ | μλ―Έ |
|---|---|---|
| SIGINT | 2 | μΈν°λ½νΈ (Ctrl+C) |
| SIGKILL | 9 | κ°μ μ’ λ£ (무μ λΆκ°) |
| SIGTERM | 15 | μ μ μ’ λ£ μμ² |
| SIGSEGV | 11 | μΈκ·Έλ©ν μ΄μ ν΄νΈ |
| SIGCHLD | 17 | μμ νλ‘μΈμ€ μν λ³ν |
IPC λ°©μ λΉκ΅ μ 리
| λ°©μ | μλ | λ°©ν₯ | κ΄κ³μλ νλ‘μΈμ€ | λΉκ³ |
|---|---|---|---|---|
| Pipe | μ€κ° | λ¨λ°©ν₯ | λΆκ° | λΆλͺ¨-μμ μ μ© |
| Named Pipe | μ€κ° | λ¨λ°©ν₯ | κ°λ₯ | νμΌ μμ€ν κ²½λ‘ |
| Message Queue | μ€κ° | μλ°©ν₯ | κ°λ₯ | λΉλκΈ°, νμ κ΅¬λΆ |
| Shared Memory | λΉ λ¦ | μλ°©ν₯ | κ°λ₯ | λκΈ°ν λ³λ νμ |
| Socket | λλ¦Ό | μλ°©ν₯ | κ°λ₯ | λ€νΈμν¬λ κ°λ₯ |
| Signal | - | λ¨λ°©ν₯ | κ°λ₯ | λ°μ΄ν° μ λ¬ λΆκ° |
μ ν κΈ°μ€
- μλκ° μ΅μ°μ μ΄κ³ κ°μ λ¨Έμ β 곡μ λ©λͺ¨λ¦¬
- λ¨μν λ°μ΄ν° νλ¦, λΆλͺ¨-μμ κ΄κ³ β νμ΄ν
- λΉλκΈ° λ©μμ§ μ λ¬ β λ©μμ§ ν
- λΆμ° νκ²½ νμ₯μ± κ³ λ € β μμΌ
- μ΄λ²€νΈ μλ¦Όλ§ νμ β μκ·Έλ
리λ μ€ μ»€λ λ΄λΆμμλ νλ‘μΈμ€ κ° νλ ₯μ΄ νμν κ²½μ° μ λ©μ»€λμ¦λ€μ μ‘°ν©ν΄μ μ¬μ©νλ€. μ€μ μμ€ν νλ‘κ·Έλλ°μμλ 곡μ λ©λͺ¨λ¦¬ + μΈλ§ν¬μ΄ μ‘°ν©μ΄ μ±λ₯μ μμ£Ό μ νλκ³ , λΆμ° μμ€ν μΌλ‘ νμ₯μ κ³ λ €νλ€λ©΄ μ²μλΆν° μμΌ(λλ λ©μμ§ λΈλ‘컀) κΈ°λ°μΌλ‘ μ€κ³νλ νΈμ΄ λ«λ€.