fifo는 먼저 들어온 순서로 동작하지만, message queue는 빠른 우선순위로 동작한다.
signal handler를 정의하여 사용할 수도 있다. message noty는 queue가 비어있을 경우 한번 동작한다. queue가 차 있다면 signal을 무시한다. 한 번 사용하면 다시 시그널을 등록해야 한다.
pi@raspberrypi:~/Project/cCode/IPC $ cat mesquereceive.c //message que header #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <sys/stat.h> #include <mqueue.h> #include <signal.h> #define MAX_SIZE 100 //signal 처리하기 위한 hanlder static void sig_usr1(int mysig); struct sigevent sigev; //signal hanlder로 사용하려고 global로 등록. mqd_t mqd; struct mq_attr attr; int priorecv; char buff[100]; int main(){ int c, flags; char const *quename="/tmp_message"; char messageptr[50]= "this is a test."; //메세지 큐 초기화 attr.mq_flags = 0; attr.mq_maxmsg = 10; attr.mq_msgsize = MAX_SIZE; attr.mq_curmsgs = 0; //message를 넣기전에 mq_notify 정의 signal(SIGUSR1, sig_usr1); sigev.sigev_notify = SIGEV_SIGNAL; sigev.sigev_signo = SIGUSR1; mq_notify(mqd, &sigev); flags = O_RDWR | O_CREAT; //gcc 컴파일시 gcc mesque.c -lrt //로 해야 컴파일 됨. mqd = mq_open(quename, flags, 0666, &attr); size_t len = sizeof(messageptr); //mq_send(mqd, messageptr, len, 10); //sleep(1); //넣은 메세지를 확인 //mq_receive(mqd, buff, attr.mq_msgsize, &priorecv); //printf("받은 메세지는\n %s를 %d 우선 순위로\n", buff, priorecv); //mq_receive(mqd, buff, attr.mq_msgsize, &priorecv); //printf("받은 메세지는\n %s를 %d 우선 순위로\n", buff, priorecv); for(;;) pause(); mq_close(mqd); return 0; } void sig_usr1(int mysig){ //signal hanlder로 message receive.. //한번 사용한 noty는 다시 등록. mq_notify(mqd, &sigev); mq_receive(mqd, buff, attr.mq_msgsize, &priorecv); printf("받은 메세지는\n %s를 %d 우선 순위로\n", buff, priorecv); return; }
pi@raspberrypi:~/Project/cCode/IPC $ cat mesquesender.c //message que header #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <sys/stat.h> #include <mqueue.h> #include <stdlib.h> #include <signal.h> #define MAX_SIZE 100 mqd_t mqd; struct mq_attr attr; int priorecv; char buff[100]; int main(int argc, char** argv){ int c, flags; int prio; char const *quename="/tmp_message"; char messageptr[50]= "this is a test."; //메세지 큐 초기화 attr.mq_flags = 0; attr.mq_maxmsg = 10; attr.mq_msgsize = MAX_SIZE; attr.mq_curmsgs = 0; flags = O_RDWR | O_CREAT; //gcc 컴파일시 gcc mesque.c -lrt //로 해야 컴파일 됨. mqd = mq_open(quename, flags, 0666, &attr); size_t len = sizeof(messageptr); prio = atoi(argv[1]); mq_send(mqd, messageptr, len, prio); mq_close(mqd); return 0; }
pi@raspberrypi:~/Project/cCode/IPC $ mv mesque.c mesquereceive.c pi@raspberrypi:~/Project/cCode/IPC $ gcc -lrt mesquereceive.c -o recv pi@raspberrypi:~/Project/cCode/IPC $ gcc -lrt mesquesender.c -o send pi@raspberrypi:~/Project/cCode/IPC $ cat /dev/mqueue/tmp_message QSIZE:0 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 pi@raspberrypi:~/Project/cCode/IPC $ ./send 세그멘테이션 오류 pi@raspberrypi:~/Project/cCode/IPC $ ./send 10 pi@raspberrypi:~/Project/cCode/IPC $ ./send 20 pi@raspberrypi:~/Project/cCode/IPC $ cat /dev/mqueue/tmp_message QSIZE:100 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 pi@raspberrypi:~/Project/cCode/IPC $ ./send 100 pi@raspberrypi:~/Project/cCode/IPC $ ./recv ^Z [1]+ Stopped ./recv pi@raspberrypi:~/Project/cCode/IPC $ bg [1]+ ./recv & pi@raspberrypi:~/Project/cCode/IPC $ cat /dev/mqueue/tmp_message QSIZE:150 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 pi@raspberrypi:~/Project/cCode/IPC $ ./send 15 pi@raspberrypi:~/Project/cCode/IPC $ bg -bash: bg: job 1 already in background pi@raspberrypi:~/Project/cCode/IPC $ jobs [1]+ Running ./recv & pi@raspberrypi:~/Project/cCode/IPC $ ./send 20 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv 16120 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 받은 메세지는 this is a test.를 100 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 받은 메세지는 this is a test.를 20 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 받은 메세지는 this is a test.를 20 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 받은 메세지는 this is a test.를 15 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 받은 메세지는 this is a test.를 10 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ pidof recv |xargs kill -10 pi@raspberrypi:~/Project/cCode/IPC $ ./send 100 받은 메세지는 this is a test.를 100 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ cat /dev/mqueue/tmp_message QSIZE:0 NOTIFY:0 SIGNO:10 NOTIFY_PID:16120 pi@raspberrypi:~/Project/cCode/IPC $ ./send 10 받은 메세지는 this is a test.를 10 우선 순위로 pi@raspberrypi:~/Project/cCode/IPC $ cat /dev/mqueue/tmp_message QSIZE:0 NOTIFY:0 SIGNO:10 NOTIFY_PID:16120 pi@raspberrypi:~/Project/cCode/IPC $
gcc 기본 컴파일하면 에러를 본다. 옵션 넣어야 한다. -lrt.