Я столкнулся со странной проблемой, когда epoll_wait
блокируется для события EPOLLOUT
в сокете домена unix в режиме краевого запуска.
Некоторые подробности: я использую boost ASIO
для IPC между двумя процессами с передачей файловых дескрипторов.
Вот несколько журналов strace:
25097 16:59:04.273555 epoll_ctl(4, EPOLL_CTL_MOD, 37, {EPOLLIN|EPOLLPRI|EPOLLOUT|EPOLLERR|EPOLLHUP|EPOLLET, {u32=40872176, u64=40872176}}) = 0
25097 16:59:04.273588 epoll_wait(4, {{EPOLLOUT, {u32=40872176, u64=40872176}}}, 128, -1) = 1
25097 16:59:04.273617 sendmsg(37, {msg_name(0)=NULL, msg_iov(1)=[{data skipped, 247}], msg_controllen=24, {cmsg_len=24, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {34, 49}}, msg_flags=0}, MSG_NOSIGNAL) = 247
25097 16:59:04.273671 epoll_ctl(4, EPOLL_CTL_DEL, 34, {0, {u32=0, u64=0}}) = 0
25097 16:59:04.273715 close(34) = 0
25097 16:59:04.273752 close(49) = 0
25097 16:59:04.273801 epoll_wait(4, {{EPOLLOUT, {u32=40872176, u64=40872176}}}, 128, -1) = 1
25097 16:59:04.273848 epoll_wait(4, <unfinished ...>
И я заблокирован на последнем epoll_wait
звонке. Насколько я понимаю, поскольку я использую режим с запуском по краю (EPOLLET
), то я точно могу заблокировать, если fd уже готов к операциям записи.
Вопрос: как отлаживать, если сокет домена unix готов к операциям записи? /proc/net/unix
ничего интересного не показывает.