epoll, запускаемый краем, для сокета домена unix

Я столкнулся со странной проблемой, когда 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 ничего интересного не показывает.


person user1641854    schedule 18.07.2016    source источник


Ответы (1)


Насколько я понимаю, поскольку я использую режим с запуском по краю (EPOLLET), то я точно могу заблокировать, если fd уже готов к операциям записи.

Я согласен.

Вопрос: как отлаживать, если сокет домена unix готов к операциям записи?

Если у вас есть файл ядра с символами отладки, вы можете сделать

gdb vmlinux /proc/kcore

и с адресом struct sock из столбца Num таблицы /proc/net/unix

p ((struct sock *)0xaddress)->sk_wmem_alloc

- проверить зафиксированные байты очереди передачи и другие элементы структуры, чтобы увидеть, осталось ли место в буфере отправки сокета.

Но на самом деле вам не нужно этого делать, потому что вывод strace уже показывает в предпоследней строке событие EPOLLOUT, а между ним и epoll_wait в последней строке нет системного вызова, который мог бы изменить ситуацию, т.е. е. нет фронта сигнала. Я думаю, что здесь неразумно ждать краевого срабатывания.

person Armali    schedule 03.08.2016