socketpair ν¨μλ₯Ό μ΄μ©ν μμΌ νλ‘κ·Έλ¨μ ꡬν - νλ‘μΈμ€ νλ
μλ‘ ν΅μ ν λλ©΄ λ κ°μ μμΌμ μμ±ν΄μ μλ£λ₯Ό μ‘μμ νλ€. μ΄λ λ κ°μ μμΌμ μμ±νλ κ°μ₯ κ°λ¨ν λ°©λ²μ΄ socketpair ν¨μλ₯Ό μ¬μ©νλ κ²μ΄λ€.
κ°λ°μκ° λ μμΌ κ°μ λ³λμ μ°κ²° κ³Όμ μ μ²λ¦¬νμ§ μμλ λ κ°μ μμΌμ μμ±νκ³ μλμΌλ‘ μ°κ²°κΉμ§ ν΄μ€λ€.
κ°λ°μλ readμ write ν¨μλ₯Ό νΈμΆν΄μ μμΌμ ν΅ν΄ μλ£λ₯Ό μ‘μμ νλ©΄ λλ€.
ν¨μ
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sd[2]);
λ°νκ°
- μ±κ³΅ μ : 0
- μ€ν¨ μ : -1
μΈμ
- domain : μ¬μ©ν νλ‘ν μ½ ν¨λ°λ¦¬
- type : ν΄λΉ νλ‘ν μ½μμ μ¬μ©ν μμΌ μ ν
- protocol : IPPROTO_TCP, IPPROTO_UDP, 0 λ±μ νλ‘ν μ½
- sd[2] : sd[0], sd[1]
#include<stdio.h>
#include<string.h>
#include <sys/socket.h>
int main(){
int sd[2], result; // 2κ°μ μμΌ μμ± sd[0] sd[1]
int n1, n2;
char buf[BUFSIZ];
char data[] = "This is from sd[0]";
result = socketpair(PF_LOCAL, SOCK_STREAM, 0, sd);
n1 = write(sd[0], data, strlen(data));
printf("[send] %s\n", data);
n2 = read(sd[1], buf, BUFSIZ);
buf[n2] = '\0';
printf("[received] %s\n", buf);
close(sd[0]);
close(sd[1]);
}
κ²°κ³Όνλ©΄
socketpair ν¨μλ‘ μμΌ sd[0]κ³Ό sd[1]μ μμ±ν ν, κ°κ°μ μμΌμ κ°λ¦¬ν€λ μμΌ κΈ°μ μλ₯Ό sd[0] sd[1]μ μ μ₯ν΄μ λ°ννλ€.
wirte ν¨μλ₯Ό νΈμΆν΄μ μμΌsd[0]μ λ¬Έμμ΄ Thisis from sd[0]μ μ°λ©΄ μμΌ sd[1]μ΄ λ¬Έμμ΄ This is from sd[0]μ μ μ‘λ°μμ μ μ μλ€.
socketpair ν¨μλ₯Ό μ΄μ©ν μμΌ νλ‘κ·Έλ¨μ ꡬν - λ νλ‘μΈμ€ κ°μ
νλ‘μΈμ€ κ°μ ν΅μ κ°λ
μ λͺ
νν νκΈ° μ°ν΄μ fork ν¨μλ‘ νλ‘μΈμ€λ₯Ό νλ λ μμ±
νμ¬ μ€νμ€μΈ νλ‘κ·Έλ¨(νλ‘μΈμ€)μμ fork ν¨μλ₯Ό νΈμΆνλ©΄ μμ κ³Ό λμΌν νλ‘μΈμ€κ° νλ λ μμ±λλ€.
μ΄ λ μλμ νλ‘μΈμ€λ₯Ό λΆλͺ¨ νλ‘μΈμ€λΌ νκ³ , μλ‘ μμ±λ νλ‘μΈμ€λ₯Ό μμ νλ‘μΈμ€λΌκ³ νλ€.
- μμνλ‘μΈμ€λ νλ‘κ·Έλ¨μ μ½λ λΆλΆ, μ§μ λ³μ, μ μ λ³μλ₯Ό λΉλ‘―νμ¬ λ μ§μ€ν°μ κΈ°ν 곡μ μμ λ± νλ‘κ·Έλ¨ μ€νμ νμν λͺ¨λ νκ²½μ 볡μ νλ€.
- λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ μ¬μ΄μ μμΌμ μ΄μ©ν΄μ μλ£λ₯Ό μ‘μμ νλ νλ‘κ·Έλ¨
- socketpair ν¨μλ₯Ό μ΄μ©ν΄μ ν μμ μμΌμ μμ±
- fork ν¨μλ₯Ό μ΄μ©ν΄μ μμ νλ‘μΈμ€λ₯Ό μμ±
- λΆλͺ¨ νλ‘μΈμ€λ νμͺ½ μμΌμ μ΄μ©ν΄μ λ¬Έμμ΄ From Parentλ₯Ό μ μ‘νκ³ , μμ νλ‘μΈμ€λ‘λΆν° μλ£λ₯Ό μ μ‘λ°μ μΆλ ₯
- μμ νλ‘μΈμ€λ μ°κ²°λ νμͺ½ μμΌμ μ΄μ©ν΄μ λΆλͺ¨ νλ‘μΈμ€λ‘λΆν° μ μ‘λ°μ λ¬Έμμ΄ μΆλ ₯νκ³ , λ¬Έμμ΄ From Childλ₯Ό λΆλͺ¨ νλ‘μΈμ€λ‘ μ μ‘
- μμ νλ‘μΈμ€λ μ°κ²°λ νμͺ½ μμΌμ μ΄μ©ν΄μ λΆλͺ¨ νλ‘μΈμ€λ‘λΆν° μ μ‘λ°μ λ¬Έμμ΄ μΆλ ₯νκ³ , λ¬Έμμ΄ From Childλ₯Ό λΆλͺ¨ νλ‘μΈμ€λ‘ μ μ‘
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
char data1[] = "From Parent";
char data2[] = "From Child";
int main(void){
int pid;
int sd[2], result;
char buf[BUFSIZ];
result = socketpair(PF_LOCAL, SOCK_STREAM, 0, sd);
pid = fork();
if(pid >0){
close(sd[1]);
read(sd[0], buf, BUFSIZ);
printf("[parent:%d] %s\n", getpid(), buf);
write(sd[0], data1, sizeof(data1));
close(sd[0]);
} else if(pid == 0){
close(sd[0]);
write(sd[1], data2, sizeof(data2));
read(sd[1], buf, BUFSIZ);
printf("[child:%d] %s\n", getpid(), buf);
close(sd[1]);
} else if(pid == -1){
perror("fork()");
}
}
κ²°κ³Όνλ©΄
fork ν¨μλ‘ μμ νλ‘μΈμ€λ₯Ό μμ±
νλ‘μΈμ€κ° fork ν¨μλ₯Ό λ§λλ©΄ νμ¬ μ€ν μ€μΈ νλ‘μΈμ€μ μ΄λ―Έμ§λ₯Ό κ·Έλλ‘ λ³΅μ¬ν΄μ μλ‘μ΄ νλ‘μΈμ€λ₯Ό λ§λ λ€.
νλ‘κ·Έλ¨μ μ€ννλ©΄ μ£ΌκΈ°μ΅ μ₯μΉμ λ‘λ©λμ΄ μ€ν μ€μΈ μνκ° λλλ°, μ€ν μ€μΈ νλ‘κ·Έλ¨(νλ‘μΈμ€)μ ꡬμ±
- μ½λ(Code) : νλ‘κ·Έλ¨ μ½λκ° μ μ₯λλ 곡κ°
- μ€ν(Stack) : μ§μ λ³μκ° μ μ₯λλ 곡κ°
- μλ£(Data) : μ μ λ³μκ° μ μ₯λλ 곡κ°
- ν(Heap) : νλ‘κ·Έλ¨ μ€ν μ€μ λμ μΌλ‘ ν λΉλλ 곡κ°
- λ μ§μ€ν°(Register) : νλ‘κ·Έλ¨ μ€ν μ μλ£ μ²λ¦¬ λ±μ μ¬μ©λλ 곡κ°
- μμ(Resource) : νμΌ κΈ°μ μ λ± μμμ ν λΉλλ