2014-12-16 3 views
0

신호가 다른 크기의 Linux Message Queue (POSIX 또는 SysV) 신호를 처리하는 가장 좋은 방법은 무엇입니까?크기가 다른 Linux 메시지 대기열 (POSIX 또는 SysV)에서 신호를 처리하는 방법은 무엇입니까?

크기가 다른 둘 이상의 신호를 수신 할 수있는 프로세스가 있다고 가정합니다. 예를 들면 :

struct sig1 { 
    long mType; 
    char data[10]; 
}; 

struct sig2 { 
    long mType; 
    char data[20000]; 
}; 

지금, 나는 메시지 큐 API를 이해, 내가의 크기에 적어도 동일 데이터에 대한 버퍼를 제공 할 수 있는지 확인해야 이러한 신호를 수신하기 위해 가장 큰 메시지는 메시지 큐에서 전달됩니다.

int msgrcv(int msqid, void *msgp, size_t msgsz, 
      long msgtyp, int msgflg); 

는 나에게 내가 그 큐에 전달 된 가장 큰 메시지로 큰받는 모든 신호에 대한 새로운 버퍼를 allocte 필요가 비현실적 보인다. 큐를 폴링하여 메시지를 대기열에서 꺼내기 전에 얼마나 큰지 알 수있는 방법이 있습니까? 이제 위에서 제공된 극단적 인 경우에 sig1이 수신 될 때마다 수신 된 모든 신호에 대해 20000 바이트를 할당해야하며 10 바이트만으로 충분합니다.

크기가 다른 신호 부하가 크고 신호가 큰 애플리케이션이 있다고 가정합니다. 이 사건을 처리 할 수있는 좋은 방법이 있습니까? 또한 퍼포먼스 관점에서, 매번 수신 할 때마다 더 큰 버퍼를 할당해야하기 때문에 퍼포먼스를 잃을까요?

답변

1

죄송 합니다만, 전체 패킷을 부분적으로 또는 전체적으로 읽을 수있는 파이프와 소켓에서 읽은 코드를 msgrcv과 혼동했습니다.

받을 수있는 모든 메시지 중에서 가장 큰 메시지를 수신 할 수있는 충분한 크기의 수신 버퍼가 있어야합니다.

실제 크기는 msgrcv의 리턴 값으로 반환되기 때문에이 같은 일이 : 당신이를 다시 구성하지 않는 한

struct sig2 msg; 
size_t n = msgrcv(queue_id, &msg, sizeof(msg.data), -1, 0); 
if (n == -1) 
{ 
    ... error - inspect errno to understand what went wrong ... 
} 

참고 또한 기본 크기는 16384 바이트되도록 20000 바이트 배열이 작동하지 않을 수 있습니다 기본 메시지 크기

+0

이제 mType 및 size 필드를 어떻게 읽으시겠습니까? (그런 필드를 추가 한 경우)? 내가 아는 한이 메시지 대기열에 사용할 수있는 엿보기 기능이 없습니다. msgrcv를 수행 할 때, 매뉴얼은 메시지가 큐에서 제거되었음을 나타냅니다. 그리고 고정 너비 정수형의 경우 http://linux.die.net/man/2/msgrcv에 따라 실제로는 long 유형이 될 수 있습니다. 시스템마다 다르므로 32 비트 아키텍처에서 실행하면 32 비트가되기를 원합니다. 64 비트 아키텍처에서도 마찬가지입니다. – Euklides

+0

@ user2043377 : 답변을 완전히 다시 작성하십시오. 그것은 늦었습니다. 그것은 제 변명입니다. 그리고 저는 그것에 충실합니다. –