datagram socket 구현시 recvfrom에서 블록킹됩니다.
1505
작성한 질문수 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
MSG_DONTWAIT 플래그는 non-blocking 모드로 동작시키겠다는 플래그 입니다. MSG_DONTWAIT 플래그를 주지 않으면 blocking 모드로 동작하게 되죠.
recvfrom()이 blocking 모드로 동작한다는 말은 메시지를 수신할 때까지 기다리고, 메시지를 수신하고 나면 API가 리턴 됩니다(에러 발생 등의 예외 상황을 제외하구요). non-blocking 모드로 동작하게 되면 recvfrom()을 호출 했을 때 수신된 메시지가 없으면 바로 API를 리턴 해줍니다. 이 때 errno를 EAGAIN으로 넘겨줍니다. 이 errno를 확인하면 수신된 메시지가 없어서 바로 리턴된 것이구나 라고 판단하시면 됩니다.
작성하신 코드에서 recvfrom()에 MSG_DONTWAIT 플래그를 설정하시고, recvfrom()이 -1을 리턴했을 때 잠시 sleep을 걸어보시면 수신된 메시지가 없을 땐 -1을 리턴하고, 수신된 메시지가 있을 때는 받은 메시지를 정상 출력하는 것을 확인하실 수 있습니다.
개인 사정으로 답변이 늦어졌습니다. 죄송합니다.
fork() 후 address
0
40
2
bind(): Address already in use
0
58
2
POSIX named semaphore 자원이 제대로 해지되지 못한 상태로 프로세스가 종료됐을 때 해당 semaphore 재사용 방법
0
215
2
강의 순서
0
262
1
강의자료 질문
0
243
1
수업 관련 질문
0
354
3
안녕하세요! 메세지 큐 방식에 대해 질문있습니다.
0
268
1
리눅스는 디버깅이 없나요?
1
722
1
fcntl 에서 Read/Write 기능
1
354
1
시스템 프로그래밍 향후 공부
1
506
1
Shared Memory와 동기화 관련
1
1181
1
거의 모든 함수를 static 선언하시는 이유는 무엇인가요?
1
2326
1
SHM_REMAP
1
317
2
recvfrom 질문
1
715
6
컴파일 질문입니다
1
675
1
partial send/recv에 관하여
1
670
1
스레드끼리의 통신에도 적용가능한가요?
1
374
1
File Lock API - 정리 table에서 multi-thread 사용가능시....
1
412
1
WSL Ubuntu에서 메시지 큐
1
464
1
shared memory(14강) live programming file mapping 에 관한 질문입니다.
1
203
1
에러 - bind(): Address already in use
1
1137
1
POSIX MQ의 설정 문의
1
602
2
accept 함수에 대한 문의
1
292
1
counting semaphore에 대해서 질문이 있습니다
0
305
3





