边缘触发了unix域套接字的epoll

时间:2016-07-18 15:49:41

标签: linux epoll unix-socket

当边缘触发模式下epoll_wait在unix域套接字上阻塞EPOLLOUT事件时,我遇到了一个奇怪的问题。

一些细节:我在文件描述符传递的两个进程之间使用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没有显示任何有趣的内容。

1 个答案:

答案 0 :(得分:1)

  

我的理解是,当我使用边缘触发模式(EPOLLET)时,   那么我肯定可以阻止fd已经准备好写了   操作

我同意。

  

问题是:如果unix域套接字可以写入,如何调试   操作

如果您的内核文件包含调试符号,则可以执行

gdb vmlinux /proc/kcore

以及Num

/proc/net/unix列中的struct sock地址
p ((struct sock *)0xaddress)->sk_wmem_alloc

- 检查已提交的传输队列字节和其他结构元素,以查看套接字的发送缓冲区是否还有剩余空间。

但实际上你不需要这样做,因为strace输出已经在倒数第二行显示EPOLLOUT事件,并且在最后一行中的epoll_wait之间没有系统可以改变这种情况的电话,我即没有信号边缘。我认为在这里等待边缘触发是不明智的。