EAGAIN 에러에 대해서 궁금합니다.

pogs의 이미지

id=msgget(IN_Q, IPC_CREAT|QPERM)
...
msgsnd(id, (char *)&mesg, IN_Q_SIZE, 0)

이렇게 데이타를 큐에 보내는데요.
error가 나서 체크해보니
EAGAIN 이라는 에러가 나네요.

이건 어떤경우에 발생되는 에러인가요? 몇시간째 고생하고 있습니다.
도와주세요.

맹고이의 이미지

구글에 검색해 보세요 8)

그리고 http://bbs.kldp.org/viewtopic.php?t=21089

에 덧글로 쓰는게 나을것 같습니다만..

isinji의 이미지

msgsnd() 호출이 Fail되고 errno가 EAGAIN으로 나오는 것은 보통 Queue가 꽉 차서 쓰지 못했기 때문입니다.

원래 queue가 꽉 차면 queue가 비어서 message를 쓸 수 있을 때 까지 Block되어야 하지만, msgsnd(..., IPC_NOWAIT)로 플래그를 지정한다면 kernel은 바로 return시킨 후 errno를 EAGAIN으로 setting합니다.
또 한가지 조건은 플래그가 설정되어 있고, 시스템 전반에 걸쳐 너무 많은 메시지가 존재할 경우 입니다. 시스템 마다 다를 수 있겠지만 보통 한번에 큐잉할 수 있는 메시지의 max 값이 정해진 것으로 압니다.

Quote:

EAGAIN : The IPC_NOWAIT flag is set, and either the maximum number of message headers has been allocated or the message queue is full.