출처.: 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.


'Language > C' 카테고리의 다른 글

C FAQ (포인터 증가 3)  (0) 2012.07.13
nmemb 의미  (0) 2012.07.12
C FAQ (포인터 증가 2)  (0) 2012.07.12
C FAQ (포인터 증가에 대해서)  (0) 2012.07.12
C-FAQ 어찌되었건 pointer 쓰면 정말 좋은가?  (0) 2012.07.12

MSG QUEUE SIZE 확인

Unix & Linux/Command-Utility / 2008/04/03 19:54

PARAMETER

MSGMNB: Maximum number of bytes per message queue.

MSGMNI: Maximum number of message queue identifiers (system wide).

MSGSEG : Maximum number of message segments per queue.

MSGSSZ : Size of a message segment.

MSGTQL : Maximum number of messages (system wide).

MSGMAX: Maximum size of a whole message. On some systems you may need to increase this limit.

                 On other systems, you may not be able to change it.

   

   

UNIX OS 에서 확인하기

  • SOLARIS

sysdef  -i | grep MSG

   

  • HP-UX

kmtune | grep msg

   

  • LINUX

cat /proc/sys/kernel/msgmax

cat /proc/sys/kernel/msgmnb

cat /proc/sys/kernel/msgmni

   

또는 sysctl 명령어를 사용할 수 있다.

   

  • sysctl option
           -n     Use this option to disable printing of the key name when printing values.

           -e     Use this option to ignore errors about unknown keys.

           -N     Use  this  option  to  only  print the names. It may be useful with shells that have pro-
                  grammable completion.

           -q     Use this option to not display the values set to stdout.

           -w     Use this option when you want to change a sysctl setting.

           -p     Load in sysctl settings from the file specified or /etc/sysctl.conf if none given.  Spec-
                  ifying - as filename means reading data from standard input.

           -a     Display all values currently available.

           -A     Display all values currently available in table form.

    EXAMPLES
           /sbin/sysctl -a

           /sbin/sysctl -n kernel.hostname

           /sbin/sysctl -w kernel.domainname="example.com"

           /sbin/sysctl -p /etc/sysctl.conf

IPC관련 Kernel Tunable Parameter 설정

Solaris

/etc/system 에 예를 들어 다음과 같이 kernel tunnable parameter를 설정하여 쓸수 있습니다.

#

#

set pt_cnt=256

set npty=256

   

set msgsys:msginfo_msgmap = 1000

set msgsys:msginfo_msgmax = 8192

set msgsys:msginfo_msgmnb = 1048576

set msgsys:msginfo_msgmni = 200

set msgsys:msginfo_msgssz = 400

set msgsys:msginfo_msgtql = 8192

set msgsys:msginfo_msgseg = 4096

   

set shmsys:shminfo_shmmax = 4294967296

set shmsys:shminfo_shmmni = 100

set shmsys:shminfo_shmseg = 32

시스템의 /etc/system을 확인해보시고, 설정이 안되어 있는 경우 설정 후 재부팅하여 장비를 재기동시켜 적용하시기 바랍니다.

   

참고: Solaris Kernel Tunable Parameter - IPC 관련

parameter | Default | Description

-----------------------------------------------------------------------

msginfo_msgmap | 100 | messages map안의 항들의 수

msginfo_msgmax | 2048 | 최대 message 크기

msginfo_msgmnb | 4096 | queue의 최대 bytes

msginfo_msgmni | 50 | mesaage queue identifers의 수

msginfo_msgssz | 8 | 한 messages의 segment 크기

msginfo_msgtql | 40 | system messages headers의 수

msginfo_msgseq | 1024 | messages segments의 수( ?<32768 )

-----------------------------------------------------------------------

seminfo_semmap | 10 | semphore map의 항들의 수

seminfo_semmni | 10 | semphore identiers의 수

seminfo_semmns | 60 | system상에 semphores의 수

seminfo_semmnu | 30 | system상에 undo structures의 수

seminfo_semmsl | 25 | id마다 semaphores의 최대 수

seminfo_semopm | 10 | semphore call마다 연산들의 최대 수

seminfo_semume | 10 | process당 undo entries의 최대 수

seminfo_semvmx | 32767 | semphore 최대값

seminfo_semaem | 16384 | maximum value for adjustment on exit

----------------------------------------------------------------------

shminfo_shmmax | 1048576 | maximum shared memory segment size

shminfo_shmmin | 1 | minimum shared memory segment size

shminfo_shmmni | 100 | shared memory identifiers의 수

shminfo_shmseg | 6 | process당 segments

-----------------------------------------------------------------------

HPUX(Tandem)

- NonStop-UX tandem 4.2MP C52IPM10.puma.0326.20:29 S4000 mips

- idtune 명령으로 kenerl 파라메터 조정 (root만 수행가능)

# /etc/conf/bin/idtune -g MSGMAX

16384 8192 512 131072

(cur) (def) (min) (max)

# /etc/conf/bin/idtune -g MSGMNB

16384 16384 4096 6291456

(cur) (def) (min) (max)

HPUX(C449)

- HP-UX dncp1 B.11.00 E 9000/888 2140000971 8-user license

- kmtune 명령으로 kernel 파라메터 조정

Parameter: msgmax

Value: 8192

Default: 8192

Parameter: msgmnb

Value: 65536

Default: 16384

HPUX(rp7420)

- HP-UX hahlr1 B.11.23 U 9000/800 3333801845 unlimited-user license

- kctune 명령으로 kernel 파라메터 조정

hahlr@hahlr1:/etc:232 % kctune msgmax

Tunable Value Expression Changes

msgmax 8192 Default Immed

hahlr@hahlr1:/etc:235 % kctune msgmnb

Tunable Value Expression Changes

msgmnb 1048576 1048576 Immed

Linux

현재 Message Queue 사이즈

#> sysctl -a | grep kernel.msg

   

kernel.msgmax = 8192

kernel.msgmni = 16

kernel.msgmnb = 16384

Message Queue 사이즈 변경

#> sysctl -w kernel.msgmni=1024

#> sysctl -w kernel.msgmnb=1048576

설정파일에 저장

vi /etc/sysctl.conf => 새 설정값 저장

kernel.msgmni=1024

kernel.msgmnb=1048576

   

   

   

   

   출처

<http://revoman.nudecode.org/110#comment8832056>에서 삽입

'Linux' 카테고리의 다른 글

NMS의 기본 개념 - 장애관리  (0) 2011.08.23
Unix Domain Socket UDP  (0) 2011.08.19
[명령어]OS 별 CPU, Memory, 커널Bit 확인방법  (0) 2011.08.11
RAID  (0) 2011.08.11
SNMP란 무엇인가요?  (0) 2011.08.11

+ Recent posts