2013-09-05 9 views
1

I는 시나리오가있다.시스템 V는

2 : Writer 프로세스가 판독기 프로세스보다 빠르다. 예를 들어 작성자 프로세스가 판독기 프로세스가 메시지를 읽고 큐를 비우는 것보다 빠르게 큐에 메시지를 쓰는 경우 (예 : 큐에 8 개의 메시지가있는 경우)) 그리고 리더 프로세스는 아직 큐에 9 번째 메시지를 쓰려고하는 writer 프로세스 (msgsnd)에서 하나의 메시지를 읽지 않습니다.

3 : 내 메시지가 덮어 쓰여지면 어떻게됩니까?

4 : 대기열에있는 마지막 또는 첫 번째 메시지를 덮어 쓰게됩니까?

5 : 전체 큐를 덮어 쓰시겠습니까?

6 : 그렇지 않으면 9 번째 메시지가 손실됩니까?

7 : 어떻게 이런 시나리오가 발생하지 않고 새로운 들어오는 메시지가 풀리지 않으며 기존 메시지를 덮어 쓰지 않게하려면 어떻게해야합니까?

8 :이 상황을 어떻게 처리 할 수 ​​있습니까?

점 3에 대해

감사

답변

2

manpage of msgsnd

When msgsnd() fails, errno will be set to one among the following values: 
... 
EAGAIN The message can't be sent due to the msg_qbytes limit for the queue 
and IPC_NOWAIT was specified in msgflg. 

따라서 당신이 큐에 다른 메시지를 추가 할 수 없습니다 말했다 당신은 다른 곳에 보관해야합니다. 큐를 열었을 때 IPC_NOWAIT를 지정하면 메시지가 손실됩니다.

+0

고마워요. 그래도 작성자 프로세스가 쓰는 버퍼 큐를 사용하고 버퍼 큐에서 메시지 큐에 메시지를 복사해도 어떻게하면이 세 프로세스의 속도를 제어 할 수 있습니까? – indranil

+1

IPC_NOWAIT 플래그없이 큐를 생성하면 msgsnd는 실패 (-1 반환)하고 errno는 EAGAIN으로 설정됩니다. 그러면 대기열이 가득 차고 적어도 하나를 추출 할 때까지 다른 메시지를 추가 할 수 없다는 것을 알려줍니다. –

+0

답장을 보내 주셔서 감사합니다. – indranil