인프런 커뮤니티 질문&답변

Andy Ahn님의 프로필 이미지

작성한 질문수

리눅스 IPC 프로그래밍 - 이론과 실습

Shared Memory(memory mapped)

datagram socket 구현시 recvfrom에서 블록킹됩니다.

19.10.13 14:06 작성

·

1.3K

1

https://github.com/positoy/study/blob/master/IPC/06_socket_datagram.c

위 코드인데요.

recvfrom의 flag를 MSG_DONTWAIT 으로 변경하면 다음처럼 write가 잘 안된 것처럼 안내합니다.

failed to recvfrom: Resource temporarily unavailable

원인이 무엇일까요?

답변 1

0

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

2019. 10. 15. 00:18

MSG_DONTWAIT 플래그는 non-blocking 모드로 동작시키겠다는 플래그 입니다. MSG_DONTWAIT 플래그를 주지 않으면 blocking 모드로 동작하게 되죠.

recvfrom()이 blocking 모드로 동작한다는 말은 메시지를 수신할 때까지 기다리고, 메시지를 수신하고 나면 API가 리턴 됩니다(에러 발생 등의 예외 상황을 제외하구요). non-blocking 모드로 동작하게 되면 recvfrom()을 호출 했을 때 수신된 메시지가 없으면 바로 API를 리턴 해줍니다. 이 때 errno를 EAGAIN으로 넘겨줍니다. 이 errno를 확인하면 수신된 메시지가 없어서 바로 리턴된 것이구나 라고 판단하시면 됩니다.

작성하신 코드에서 recvfrom()에 MSG_DONTWAIT 플래그를 설정하시고, recvfrom()이 -1을 리턴했을 때  잠시 sleep을 걸어보시면 수신된 메시지가 없을 땐 -1을 리턴하고, 수신된 메시지가 있을 때는 받은 메시지를 정상 출력하는 것을 확인하실 수 있습니다.

개인 사정으로 답변이 늦어졌습니다. 죄송합니다. 

Andy Ahn님의 프로필 이미지

작성한 질문수

질문하기