출처.: http://www.falinux.com/
IPC의 시작인 메시지큐 통신이다.
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
int msqid |
메시지 큐 식별자 , msgget 함수의 리턴값이다. |
void *msgp |
전송할 자료, void 포인터니까 아무 자료형이나 덮어쓰면된다. |
size_t msgsz |
전송할 자료의 크기, 자료가 구조체건 뭐건 sizeof로 정확한 크기면 된다. |
int msgflg |
동작 옵션, 큐에 공간이 있을떄까지 기다리면 0, 여유공간 없으면 복귀 시킬경우, IPC_NOWAIT. |
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
int msqid |
메시지 큐 식별자, msgget 함수의 리턴값. |
void *msgp |
전송할 자료, 마찬가지로 아무 자료형이나 선언하기 나름. |
size_t msgsz |
전송할 자료의 크기, 위에 선언한거에 그냥 sizeof로 정확한 사이즈로 기재하면되고 |
logn msgtyp int msgflg |
수신할 메시지 타입, 0이면 다 받고 0보다 크면 큐에 가장 처음 메시지에서 타입이 같은거만 받고 동작 옵션 |
--------------------------------------------------------------------------
=== 메시지 수신하는 코드 === #include#include #include #include "sys/types.h" #include "sys/ipc.h" #include "sys/msg.h" #define BUFF_SIZE 1024 #define KEY 35002 typedef struct { int msgid; long type; char buff[BUFF_SIZE]; } t_data; int main() { int msqid; t_data data; printf("t_data size = %d\n", sizeof(t_data)); printf("long size = %d\n", sizeof(long)); if (( msqid = msgget( (key_t)KEY, IPC_CREAT|0666)) == -1) { perror( "msgget() fail"); return -1; } while(1) { /* IPC message recv */ if(msgrcv(msqid, &data, sizeof(t_data)-sizeof(long), 1, 0) == -1) { perror( "msgrcv() fail"); return -2; } printf( "ID=[%d] MSG => %s\n", data.msgid, data.buff); } return 0; } /* end of the program */
===수신측 결과=== ID=[1] MSG => msg_type=0,index=1, message queue program ID=[1] MSG => msg_type=10,index=11, message queue program
=== 메시지 송신하는 코드 === #include#include #include #include #include "sys/types.h" #include "sys/ipc.h" #include "sys/msg.h" #include #define BUFF_SIZE 1024 #define KEY 35002 typedef struct { int msgid; long type; char buff[BUFF_SIZE]; } t_data; int main() { int msqid; int index = 0; int ret = 0; t_data data; printf("t_data size = %d\n", sizeof(t_data)); printf("long size = %d\n", sizeof(long)); if((msqid = msgget((key_t)KEY, IPC_CREAT|0666))== -1) { perror( "msgget() Fail"); return -1; } while(1) { data.type = index; data.msgid = ((index++ %10)+1); sprintf( data.buff, "msg_type=%ld,index=%d, message queue program", data.type, index); printf( "ID=[%d] MSG => %s\n", data.msgid, data.buff); /* IPC message send */ ret = msgsnd(msqid, &data, (sizeof(t_data)-sizeof(long)), 0); if(ret == -1) { perror( "msgsnd() Fail"); return -2; } /* sleep 2 seconde */ poll(0, 0, 2000); } return 0; }
===송신측 결과 === ID=[1] MSG => msg_type=0,index=1, message queue program ID=[2] MSG => msg_type=1,index=2, message queue program ID=[3] MSG => msg_type=2,index=3, message queue program ID=[4] MSG => msg_type=3,index=4, message queue program ID=[5] MSG => msg_type=4,index=5, message queue program ID=[6] MSG => msg_type=5,index=6, message queue program ID=[7] MSG => msg_type=6,index=7, message queue program ID=[8] MSG => msg_type=7,index=8, message queue program ID=[9] MSG => msg_type=8,index=9, message queue program ID=[10] MSG => msg_type=9,index=10, message queue program ID=[1] MSG => msg_type=10,index=11, message queue program ID=[2] MSG => msg_type=11,index=12, message queue program
--------------------------------------------------------------------------
위에 보면 10으로 나눈 나머지에서 1이 되는 경우에만 수신하도록 구현되어 있다.
가장 중요한 부분은
메시지 사이즈 부분에 sizeof(long)만큼을 뺴주었는데
그 이유는 아래와 같다...
전에 이거 몰라서 찾는데 일주일 날린것만 생각하면.. 치가 떨린다...
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
The mtext field is an array (or other structure) whose size is specified by msgsz, a nonnegative integer value.
C FAQ (포인터 증가 3) (155) | 2012.07.13 |
---|---|
nmemb 의미 (153) | 2012.07.12 |
C FAQ (포인터 증가 2) (7) | 2012.07.12 |
C FAQ (포인터 증가에 대해서) (7) | 2012.07.12 |
C-FAQ 어찌되었건 pointer 쓰면 정말 좋은가? (7) | 2012.07.12 |