π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] νλ‘μΈμ€ κ° ν΅μ (IPC) with νμΌ λμ€ν¬λ¦½ν° κΈ°λ° (PIPE, FIFO) λ³Έλ¬Έ
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] νλ‘μΈμ€ κ° ν΅μ (IPC) with νμΌ λμ€ν¬λ¦½ν° κΈ°λ° (PIPE, FIFO)
μ§μ§μνμΉ΄ 2024. 1. 11. 19:02<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
β IPC (Inter-Process Communication)
νλ‘μΈμ€ κ° ν΅μ μ μν κΈ°λ²
βοΈ νμΌ μμ€ν
νλ‘μΈμ€ κ°μ λ²νΌ μ©λμ μ¬μ©ν μ μλ νμΌμ μμ±νκ³ , λ€μμ νλ‘μΈμ€κ° ν νμΌμ κ²½μ νλ λ°©λ²μΌλ‘ νμΌμ μ μΆλ ₯ μμ μ μνν΄μ μλ‘ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€
μ΄μ체μ μ λ°λΌ μ°κΈ° μ©λλ‘λ νλμ νλ‘μΈμ€λ§ νμΌμ μ΄ μ μκΈ° λλ¬Έμ, μ΄λ€ νλ‘μΈμ€κ° νμΌμ μ΄μ©νκ³ μλμ§ νμΈνλ μ μ°¨κ° νμνλ€
νμΌ μμ€ν μ μ μΆλ ₯ λ€μ€ν μ λ¬Έμ ν΄κ²°μ΄ μ΄λ ΅λ€
νμΌ μ μΆλ ₯ μ λΉλ²ν μμ€ν νΈμΆμ΄ λ°μνλ€
κ΅¬λΆ | λ΄μ© |
νμΌ λμ€ν¬λ¦½ν° κΈ°λ°μ IPC | νμ΄νμ FIFO(λ¨λ°ν₯), μμΌ(μλ°©ν₯) |
μ λμ€ μμ€ν μ Vμ IPC | λ©μμ§ ν, μΈλ§ν¬μ΄, 곡μ λ©λͺ¨λ¦¬ |
POSIXμ IPC | λ©μμ§ ν, λ€μλ μΈλ§ν¬μ΄, mmap(곡μ λ©λͺ¨λ¦¬) |
νμ΄νλ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ μ¬μ΄μμλ§ ν΅μ μ΄ κ°λ₯
FIFO, μμΌ, λ©μμ§ ν, 곡μ λ©λͺ¨λ¦¬λ μλ‘ κ΄κ³μλ νλ‘μΈμ€ μ¬μ΄μμ ν΅μ μ΄ κ°λ₯ν¨
βοΈ νμ΄ν (pipe)
μ λμ€μ νλ‘μΈμ€ κ°μ λ¨λ°©ν₯ ν΅μ λ©μ»€λμ¦
ps aux | more
ν΅μ μ μν νμΌ λ²νΌλ 컀λ λ΄μ μ‘΄μ¬νλ λ²νΌλ‘μ λ³΄ν΅ 4KB μ΄μμ ν¬κΈ°λ₯Ό κ°μ§κ³ μλ€
νμ΄νλ λ¨λ°©ν₯μ΄λΌ μλ°©ν₯ ν΅μ μ μν΄μ 2κ°μ νμ΄νκ° νμνλ€
pipe() ν¨μλ‘ νμ΄νλ₯Ό μμ°νλ©°, 2κ°μ νμΌ λμ€ν¬λ¦½ν°μ λν λ°°μ΄μ μΈμλ‘ μ¬μ©νλ€
νμ΄νλ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ μ¬μ΄μ ν΅μ μ μν΄ μ¬μ©λλλ°, μμ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° μμμΌλ‘ IPC μ±λμ μ‘°μΈ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€
λΆλͺ¨ νλ‘μΈμ€μμ νμ΄νλ₯Ό μμ±νκ³ fork() μν μ νμΌ λμ€ν¬λ¦½ν° μμ λ©μ»€λμ¦μ μν΄μ μμ νλ‘μΈμ€μκ²λ κ°μ νμ΄νλ₯Ό μμν μ μλ€
λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€μμλ νμ΄νμ λ°©ν₯μ κ²°μ ν ν νμ μλ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ«κ³ λλ¨Έμ§ νμΌ λμ€ν¬λ¦½ν°λ‘ ν΅μ νλ€
pipe() ν¨μλ₯Ό μ΄μ©ν΄ νμ΄νλ₯Ό λ¨Όμ μμ±ν ν fork() ν¨μλ₯Ό μ΄μ©ν΄μ μμ νλ‘μΈμ€λ₯Ό μμ±νλ€
μμ νλ‘μΈμ€μμ λΆλͺ¨ νλ‘μΈμ€λ‘ νμ¬ μκ°μ λν λ©μμ§λ₯Ό 보λΈλ€
μμ νλ‘μΈμ€μμλ μ½κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν°λ₯Ό pfd[0] λ‘ μ€μ ν ν μ΄λ₯Ό λ«μκ³ ,
λΆλͺ¨ νλ‘μΈμ€μμλ μ°κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν°λ‘ pfd[1] λ‘ μ€μ ν ν λ«μλ€
μμ νλ‘μΈμ€μ pfd[1] μ ν΅ν΄μ λ©μμ§λ₯Ό 보λ΄λ©΄ λΆλͺ¨ νλ‘μΈμ€μ pfd[0] μ ν΅ν΄μ λ©μμ§λ₯Ό λ°μ μ μλ€
ls λ data λͺ
λ Ήμ΄μ μΆλ ₯ κ²°κ³Όλ νμ€ μΆλ ₯ (stdout) ν΅ν΄μ μΆλ ₯λλ€
νμ€ μΆλ ₯μΌλ‘ μΆλ ₯λλ λ΄μ©μ νλ‘κ·Έλ¨ λ΄μμ μ
λ ₯μΌλ‘ μ¬μ©νκΈ° μν΄μλ νμ€ μΆλ ₯μ λ€λ₯Έ νμΌ λμ€ν¬λ¦½ν°λ‘ λ리κ³
μ΄ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ¬μ©νλ©΄ λλ€ (μ λμ€μμ dup, dup2() ν¨μλ₯Ό μ 곡ν¨)
date λͺ
λ Ήμ΄λ₯Ό μννλ©΄ νμ€ μΆλ ₯μΌλ‘ μΆλ ₯λλ λ΄μ©μ΄ μμ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° pfd[1] μΌλ‘ λ€μ΄κ°μ νμ΄νλ₯Ό ν΅ν΄μ
λΆλͺ¨ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° pfd[0] μ μ λ¬λλ€
νμΌ λμ€ν¬λ¦½ν° pfd[0] μ μ½μΌλ©΄ μμ νλ‘μΈμ€μμ λ³΄λΈ λ©μμ§λ₯Ό μ½μ μ μλ€
νμ΄νμ ν΅μ μ μν μμ
μ΄ μλ£λλ©΄ ν΄λΉ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ«μμ£Όλ©΄ λλ€
// νμ΄νλ₯Ό μμ±ν΄μ μμ νλ‘μΈμ€μ λΆλͺ¨ νλ‘μΈμ€ μ¬μ΄μμ κ°λ¨ν λ©μμ§λ₯Ό μ λ¬νλ νλ‘κ·Έλ¨
#include <stdio.h> /* printf( ) ν¨μλ₯Ό μν΄ μ¬μ© */
#include <unistd.h>
#include <sys/wait.h> /* waitpid() ν¨μλ₯Ό μν΄ μ¬μ© */
int main(int argc, char **argv)
{
pid_t pid;
int pfd[2];
char line[BUFSIZ]; /* <stdio.h> νμΌμ μ μλ λ²νΌ ν¬κΈ°λ‘ μ€μ */
int status;
if(pipe(pfd) < 0) { /* pipe( ) ν¨μλ₯Ό μ΄μ©ν΄μ νμ΄ν μμ± */
perror("pipe()");
return -1;
}
if((pid = fork()) < 0) { /* fork( ) ν¨μλ₯Ό μ΄μ©ν΄μ νλ‘μΈμ€ μμ± */
perror("fork()");
return -1;
} else if(pid == 0) { /* μμ νλ‘μΈμ€μΈ κ²½μ°μ μ²λ¦¬ */
close(pfd[0]); /* μ½κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν° λ«κΈ° */
dup2(pfd[1], 1); /* μ°κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν°λ₯Ό νμ€ μΆλ ₯(1)μΌλ‘ λ³κ²½ */
execl("/bin/date", "date", 0); /* date λͺ
λ Ήμ΄ μν */
close(pfd[1]); /* μ°κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν° λ«κΈ° */
_exit(127);
} else { /* λΆλͺ¨ νλ‘μΈμ€μΈ κ²½μ°μ μ²λ¦¬ */
close(pfd[1]); /* μ°κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν° λ«κΈ° */
if(read(pfd[0], line, BUFSIZ) < 0) { /* νμΌ λμ€ν¬λ¦½ν°λ‘λΆν° λ°μ΄ν° μ½κΈ° */
perror("read()");
return -1;
}
printf("%s", line); /* νμΌ λμ€ν¬λ¦½ν°λ‘λΆν° μ½μ λ΄μ©μ νλ©΄μ νμ */
close(pfd[0]); /* μ½κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν° λ«κΈ° */
waitpid(pid, &status, 0); /* μμ νλ‘μΈμ€μ μ’
λ£λ₯Ό κΈ°λ€λ¦¬κΈ° */
}
return 0;
}
/*
pipe() ν¨μλ₯Ό μ΄μ©ν΄ νμ΄νλ₯Ό λ¨Όμ μμ±ν ν fork() ν¨μλ₯Ό μ΄μ©ν΄μ μμ νλ‘μΈμ€λ₯Ό μμ±νλ€
μμ νλ‘μΈμ€μμ λΆλͺ¨ νλ‘μΈμ€λ‘ νμ¬ μκ°μ λν λ©μμ§λ₯Ό 보λΈλ€
μμ νλ‘μΈμ€μμλ μ½κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν°λ₯Ό pfd[0] λ‘ μ€μ ν ν μ΄λ₯Ό λ«μκ³ ,
λΆλͺ¨ νλ‘μΈμ€μμλ μ°κΈ°λ₯Ό μν νμΌ λμ€ν¬λ¦½ν°λ‘ pfd[1] λ‘ μ€μ ν ν λ«μλ€
μμ νλ‘μΈμ€μ pfd[1] μ ν΅ν΄μ λ©μμ§λ₯Ό 보λ΄λ©΄ λΆλͺ¨ νλ‘μΈμ€μ pfd[0] μ ν΅ν΄μ λ©μμ§λ₯Ό λ°μ μ μλ€
ls λ data λͺ
λ Ήμ΄μ μΆλ ₯ κ²°κ³Όλ νμ€ μΆλ ₯ (stdout) ν΅ν΄μ μΆλ ₯λλ€
νμ€ μΆλ ₯μΌλ‘ μΆλ ₯λλ λ΄μ©μ νλ‘κ·Έλ¨ λ΄μμ μ
λ ₯μΌλ‘ μ¬μ©νκΈ° μν΄μλ νμ€ μΆλ ₯μ λ€λ₯Έ νμΌ λμ€ν¬λ¦½ν°λ‘ λ리κ³
μ΄ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ¬μ©νλ©΄ λλ€ (μ λμ€μμ dup, dup2() ν¨μλ₯Ό μ 곡ν¨)
date λͺ
λ Ήμ΄λ₯Ό μννλ©΄ νμ€ μΆλ ₯μΌλ‘ μΆλ ₯λλ λ΄μ©μ΄ μμ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° pfd[1] μΌλ‘ λ€μ΄κ°μ νμ΄νλ₯Ό ν΅ν΄μ
λΆλͺ¨ νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° pfd[0] μ μ λ¬λλ€
νμΌ λμ€ν¬λ¦½ν° pfd[0] μ μ½μΌλ©΄ μμ νλ‘μΈμ€μμ λ³΄λΈ λ©μμ§λ₯Ό μ½μ μ μλ€
νμ΄νμ ν΅μ μ μν μμ
μ΄ μλ£λλ©΄ ν΄λΉ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ«μμ£Όλ©΄ λλ€
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o pipe pipe.c
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./pipe
*/
gcc -o pipe pipe.c
./pipe
βοΈ FIFO
νμ΄νμ μ μ¬ν λ¨λ°©ν₯ ν΅μ
FIFO νμΌμ μ¬μ©ν΄μ IPC μ±λμ μ‘°μΈ λ¬Έμ λ₯Ό ν΄κ²°νλ€ ( = λ€μλ νμ΄ν Named Pipe )
FIFO μ¬μ©νκΈ° μν΄μλ μ±λ μν μ νλ FIFO νμΌμ μμ±νλλ°, μ΄ νμΌμ λ°μ΄ν° μ μ‘μμ μ¬μ©λλ κ²μ΄ μλλΌ νλ‘μΈμ€ κ° μ±λμ ν립νκΈ° μν΄μλ§ μ¬μ©λλ€
μλ² νλ‘μΈμ€λ ν΄λΌμ΄μΈνΈ νλ‘μΈμ€λ κ°μ λμΌν FIFO νμΌμ μ΄κ³ , μ»μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ΄μ©ν΄μ ν΅μ νλ€
mkfifo() ν¨μλ₯Ό μ΄μ©ν΄μ FIFO νμΌμ μμ±νκ³ , open() ν¨μ νΈμΆ ν λ°νλλ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ΄μ©ν΄μ read() λ write() ν¨μλ‘ ν΅μ μ μννλ©΄ λλ€
// FIFO μ¬μ©νκΈ° μν Server
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> /* read(), close(), unlink() λ±μ μμ€ν
μ½μ μν ν€λ νμΌ */
#include <sys/stat.h>
#define FIFOFILE "fifo"
int main(int argc, char **argv)
{
int n, fd;
char buf[BUFSIZ];
unlink(FIFOFILE); /* κΈ°μ‘΄μ FIFO νμΌμ μμ νλ€. */
if(mkfifo(FIFOFILE, 0666) < 0) { /* μλ‘μ΄ FIFO νμΌμ μμ±νλ€. */
perror("mkfifo()");
return -1;
}
if((fd = open(FIFOFILE, O_RDONLY)) < 0) { /* FIFOλ₯Ό μ°λ€. */
perror("open()");
return -1;
}
while((n = read(fd, buf, sizeof(buf))) > 0) /* FIFOλ‘λΆν° λ°μ΄ν°λ₯Ό λ°μμ¨λ€. */
printf("%s", buf); /* μ½μ΄μ¨ λ°μ΄ν°λ₯Ό νλ©΄μ μΆλ ₯νλ€. */
close(fd);
return 0;
}
/*
FIFO μλ²λ FIFO ν΅μ μ μν νμΌμ μμ±νκ³ FIFO νμΌμ μ° ν, ν΄λΌμ΄μΈνΈμμ λ°μ΄ν°κ° μ€λ©΄ μ½μ΄μ νλ©΄μ μΆλ ₯νλ€
FIFO μλ²λ λ°±κ·ΈλΌμ΄λ λͺ¨λλ‘ μ€νν ν FIFO ν΄λΌμ΄μΈνΈλ₯Ό μ€ννλ€
FIFO ν΄λΌμ΄μΈνΈμμ μ
λ ₯ν΄μ λ³΄λΈ λ΄μ©μ΄ μλ²λ₯Ό ν΅ν΄μ νλ©΄μ νμλλ€
Ctrl+C λλ¬μ ν΄λΌμ΄μΈνΈ μ€νμ μ’
λ£νλ©΄ FIFO κ° κΉ¨μ§κΈ° λλ¬Έμ μλ²λ μ’
λ£λλ€
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o fifo_server fifo_server.c
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./fifo_server &
*/
// FIFO μ¬μ©νκΈ° μν Client
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define FIFOFILE "fifo"
int main(int argc, char **argv)
{
int n, fd;
char buf[BUFSIZ];
if((fd = open(FIFOFILE, O_WRONLY)) < 0) { /* FIFOλ₯Ό μ°λ€. */
perror("open()");
return -1;
}
while ((n = read(0, buf, sizeof(buf))) > 0) /* ν€λ³΄λλ‘λΆν° λ°μ΄ν°λ₯Ό μ
λ ₯λ°λλ€ */
write(fd, buf, n); /* FIFOλ‘ λ°μ΄ν°λ₯Ό 보λΈλ€. */
close(fd);
return 0;
}
/*
FIFO νμΌμ μ° ν ν€λ³΄λλ‘λΆν° λ°μ΄ν°λ₯Ό μ½μ΄μ μλ²μκ²λ‘ ν΄λΉ λ°μ΄ν°λ₯Ό μΆλ ₯νλ€
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o fifo_client fifo_client.c
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./fifo_client
*/
gcc -o fifo_server fifo_server.c
./fifo_server &
gcc -o fifo_client fifo_client.c
./fifo_client
-> message enter