신호가 다른 크기의 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 바이트만으로 충분합니다.
크기가 다른 신호 부하가 크고 신호가 큰 애플리케이션이 있다고 가정합니다. 이 사건을 처리 할 수있는 좋은 방법이 있습니까? 또한 퍼포먼스 관점에서, 매번 수신 할 때마다 더 큰 버퍼를 할당해야하기 때문에 퍼포먼스를 잃을까요?
이제 mType 및 size 필드를 어떻게 읽으시겠습니까? (그런 필드를 추가 한 경우)? 내가 아는 한이 메시지 대기열에 사용할 수있는 엿보기 기능이 없습니다. msgrcv를 수행 할 때, 매뉴얼은 메시지가 큐에서 제거되었음을 나타냅니다. 그리고 고정 너비 정수형의 경우 http://linux.die.net/man/2/msgrcv에 따라 실제로는 long 유형이 될 수 있습니다. 시스템마다 다르므로 32 비트 아키텍처에서 실행하면 32 비트가되기를 원합니다. 64 비트 아키텍처에서도 마찬가지입니다. – Euklides
@ user2043377 : 답변을 완전히 다시 작성하십시오. 그것은 늦었습니다. 그것은 제 변명입니다. 그리고 저는 그것에 충실합니다. –