π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] νλ‘μΈμ€ κ° ν΅μ (IPC) with POSIXμ IPC (POSIX λ©μμ§ ν, λ€μλ μΈλ§ν¬μ΄) λ³Έλ¬Έ
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] νλ‘μΈμ€ κ° ν΅μ (IPC) with POSIXμ IPC (POSIX λ©μμ§ ν, λ€μλ μΈλ§ν¬μ΄)
μ§μ§μνμΉ΄ 2024. 1. 13. 17:41<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
β POSIX λ©μμ§ ν
μμ€ν Vμ λ©μμ§ νμ λ§μ°¬κ°μ§λ‘ POSIX λ©μμ§ νλ₯Ό μ¬μ©νλ©΄ νλ‘μΈμ€ κ°μ λ©μμ§μ ννλ‘ λ°μ΄ν°λ₯Ό μ μ‘ν μ μλ€
μμ€ν Vμ ν¨μλ€μ΄ μμ€ν μ½μΈ κ²μ λΉν΄μ POSIX ν¨μλ λΌμ΄λΈλ¬λ¦¬ ννλ‘ μ 곡λλ€
POSIX μ λ©μμ§ νλ mqd_t νμ μ΄μ©νλ€
λ©μμ§ νμ μμ±κ³Ό νλμ μν΄ mq_open() ν¨μλ₯Ό μ¬μ©νλ€
mq_open() ν¨μλ₯Ό μ¬μ©νλ©΄ mqd_t νμ λ°νλ°μ ν μ΄μ©ν μ μλ€
λ©μμ§ νμ μ‘μμ μ μν΄ mq_send() μ mq_receive() ν¨μλ₯Ό μ¬μ©νλ€
νλ‘μΈμ€κ° νμ μ¬μ©μ λλΌ λ mq_close() ν¨μλ‘ λ«λλ€
λ©μμ§ νκ° λ μ΄μ νμ μκ² λ κ²½μ° mq_unlink() ν¨μλ₯Ό μ¬μ©ν΄ νλ₯Ό μμ νλ€
λ©μμ§ νμ μμ±μ mq_getattr() λ‘ μ»λλ€
λ©μμ§ νμ μμ±μ mq_setattr() ν¨μλ‘ λ³κ²½νλ€
λ©μμ§κ° μ€λ κ²μ λΉλκΈ°μ μΌλ‘ ν΅μ§ λ°λ mq_notify() ν¨μ
// POSIX λ©μμ§ νλ‘ λ©μμ§ μΆλ ₯νμ Server
#include <stdio.h>
#include <unistd.h>
#include <mqueue.h>
int main(int argc, char **argv)
{
mqd_t mq;
struct mq_attr attr;
const char* name = "/posix_msq"; /* λ©μμ§ νλΌλ¦¬ 곡μ ν μ΄λ¦ */
char buf[BUFSIZ];
int n;
/* λ©μμ§ ν μμ±μ μ΄κΈ°ν */
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = BUFSIZ;
attr.mq_curmsgs = 0;
mq = mq_open(name, O_CREAT | O_RDONLY, 0644, &attr);
/* λ©μμ§ νμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€. */
while(1) {
n = mq_receive(mq, buf, sizeof(buf), NULL);
switch (buf[0]) {
/* λ©μμ§κ° ‘q’ μ΄λ©΄ ENDλ‘ μ΄λ */
case 'q':
goto END;
break;
/* λ€λ₯Έ λ©μμ§μ΄λ©΄ νλ©΄μ κ°μ Έμ¨ λ°μ΄ν°λ₯Ό μΆλ ₯νλ€. */
default:
write(1, buf, n);
break;
}
}
END: /* λ©μμ§ νλ₯Ό λ«μ ν μ 리νκ³ νλ‘κ·Έλ¨μ μ’
λ£νλ€. */
mq_close(mq);
mq_unlink(name);
return 0;
}
/*
μλ²λ₯Ό μμ±νλ€
μλ²μμ ν΅μ μ μν λ©μμ§ νλ₯Ό mq_open() ν¨μλ₯Ό ν΅ν΄ λ§λ€κ³ ,
mq_receive() ν¨μλ‘ λ°μ΄ν°λ₯Ό λ°μμ¨λ€
κ°μ Έμ¨ λ°μ΄ν°λ₯Ό νλ©΄μ μΆλ ₯νκ³ , "q" κ° λ€μ΄μ¨ κ²½μ°μ λ©μμ§ νλ₯Ό λ«μ ν μ 리νκ³ νλ‘κ·Έλ¨ μ’
λ£
rt(Realtime) λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¨κ» λ§ν¬ν΄μΌνλ€
gani@gani:~/raspi/Process_Signal $ gcc -o posix_msg_server posix_msg_server.c -lrt
gani@gani:~/raspi/Process_Signal $ ./posix_msg_server &
*/
// POSIX λ©μμ§ νλ‘ λ©μμ§ μΆλ ₯νμ Client
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <mqueue.h>
int main(int argc, char **argv)
{
mqd_t mq;
const char* name = "/posix_msq";
char buf[BUFSIZ];
mq = mq_open(name, O_WRONLY);
/* "Hello, World!"λΌλ λ¬Έμμ΄μ 보λΈλ€. */
strcpy(buf, "Hello, World!\n");
mq_send(mq, buf, strlen(buf), 0); /* λ©μμ§ νλ‘ λ°μ΄ν°λ₯Ό 보λΈλ€. */
/* "q"λ‘ μ€μ νκ³ λ³΄λΈλ€. */
strcpy(buf, "q");
mq_send(mq, buf, strlen(buf), 0);
/* λ©μμ§ νλ₯Ό λ«λλ€. */
mq_close(mq);
return 0;
}
/*
λ©μμ§ ν ν΄λΌμ΄μΈνΈλ λ©μμ§ νλ₯Ό μλ‘ μμ±νλ κ²μ΄ μλλΌ κΈ°μ‘΄μ μ‘΄μ¬νκ³ μλ λ©μμ§ νλ₯Ό μ°λ€
mq_send() ν¨μλ₯Ό μ΄μ©ν΄μ λ©μμ§λ₯Ό 보λ΄λλ°, μ²μμλ λ¬Έμμ΄μ 보λ΄κ³ λ€μ "q" λ₯Ό 보λ΄μ μλ²λ₯Ό μ’
λ£νλ€
λ©μμ§ νμ μ¬μ©μ΄ λλλ©΄ mq_close() ν¨μλ‘ λ©μμ§ νλ₯Ό λ«μ§λ§, μλ²μλ λ€λ₯΄κ² λ©μμ§ νλ₯Ό μμ νμ§ μλλ€
rt(Realtime) λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¨κ» λ§ν¬ν΄μΌνλ€
gani@gani:~/raspi/Process_Signal $ gcc -o posix_msg_client posix_msg_client.c -lrt
gani@gani:~/raspi/Process_Signal $ ./posix_msg_client
*/
gcc -o posix_msg_server posix_msg_server.c -lrt
./posix_msg_server &
gcc -o posix_msg_client posix_msg_client.c -lrt
./posix_msg_client
βοΈ λ€μλ μΈλ§ν¬μ΄
리λ μ€μμ μΈλ§ν¬μ΄λ₯Ό λ³΄λ€ μ½κ² μ¬μ©ν μ μλ λΌμ΄λΈλ¬λ¦¬ ννμ ν¨μλ€
μΈλ§ν¬μ΄λ₯Ό μ¬μ©νκΈ° μ μ λ°λμ sem_t νμ μ΄κΈ°ν ν΄μΌ νλ€
μ΄κΈ°νλ sem_open() ν¨μλ₯Ό μ¬μ©
sem_open() ν¨μμ 첫 λ²μ§Έ μΈμλ‘ λ€λ₯Έ μΈλ§ν¬μ΄μ ꡬλΆν μ μλ μ΄λ¦ λ€μ΄κ°λ―λ‘ λ€μλ(named) μΈλ§ν¬μ΄λΌκ³ λΆλ₯Έλ€
μ΄κΈ°νκ° λλλ©΄ P μ°μ°κ³Ό V μ°μ°μ μννλ©΄ λλλ°, sem_post() μ sem_wait() ν¨μλ₯Ό μ¬μ©νλ€
μ¬μ©μ΄ λ€ λλ μΈλ§ν¬μ΄λ sem_close() ν¨μλ‘ λ«κ³ , μ κ±°λ sem_destroy() ν¨μλ₯Ό μ¬μ©νλ€
μ¬μ©μ΄ λ€ λλ ν λ μ΄μ νμκ° μμ΄μ‘μ λ sem_unlink() μ΄μ©ν΄μ λ€μλ μΈλ§ν¬μ΄λ₯Ό μμ νλ€
phread λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§ν¬νμ¬ μμ€ μ½λλ₯Ό λΉλν΄μΌ νλ€
// λΌμ΄λΈλ¬λ¦¬λ‘ μΈλ§ν¬μ΄ μ¬μ©νκΈ°
#include <stdio.h> /* printf() ν¨μλ₯Ό μν ν€λ νμΌ */
#include <fcntl.h> /* O_CREAT, O_EXEC 맀ν¬λ‘λ₯Ό μν ν€λ νμΌ */
#include <unistd.h>
#include <semaphore.h> /* sem_open(), sem_destroy(), sem_wait() λ± ν¨μλ₯Ό μν ν€λ νμΌ */
sem_t *sem; /* μΈλ§ν¬μ΄λ₯Ό μν μ μ λ³μ */
static int cnt = 0; /* μΈλ§ν¬μ΄μμ μ¬μ©ν μκ³ κ΅¬μ λ³μ */
void p() /* μΈλ§ν¬μ΄μ P μ°μ° */
{
cnt--;
sem_post(sem);
}
void v() /* μΈλ§ν¬μ΄μ V μ°μ° */
{
cnt++;
sem_wait(sem);
}
int main(int argc, char **argv)
{
const char* name = "posix_sem";
unsigned int value = 8; /* μΈλ§ν¬μ΄μ κ° */
/* μΈλ§ν¬μ΄ μ΄κΈ° */
sem = sem_open(name, O_CREAT, S_IRUSR | S_IWUSR, value);
while(1) {
if(cnt >= 8) {
p();
printf("decrease : %d\n", cnt);
break;
} else {
v();
printf("increase : %d\n", cnt) ;
usleep(100);
}
}
/* λ€ μ΄ μΈλ§ν¬μ΄ λ«κ³ μ 리 */
sem_close(sem);
printf("sem_destroy return value : %d\n", sem_destroy(sem));
/* μΈλ§ν¬μ΄ μμ */
sem_unlink(name);
return 0;
}
/*
phread λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§ν¬νλ€
μμ€ν
Vμ μΈλ§ν¬μ΄μ κ°μ κ²°κ³Όκ° λμ¨λ€
gani@gani:~/raspi/Process_Signal $ gcc -o posix_sem posix_sem.c -pthread
gani@gani:~/raspi/Process_Signal $ ./posix_sem
*/
gcc -o posix_sem posix_sem.c -pthread
./posix_sem