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

linux epoll unix-socket

760 просмотра

1 ответ

872 Репутация автора

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

Автор: user1641854 Источник Размещён: 18.07.2016 03:49

Ответы (1)


1 плюс

9415 Репутация автора

Решение

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

Я согласен.

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

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

gdb vmlinux /proc/kcore

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

p ((struct sock *) 0x address ) -> sk_wmem_alloc

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

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

Автор: Armali Размещён: 03.08.2016 06:04
Вопросы из категории :
32x32