2016-07-18 10 views
1

epoll_waitがエッジトリガーモードのunixドメインソケットでEPOLLOUTイベントをブロックしていると、私は奇妙な問題に遭遇しました。unixドメインソケットのエッジトリガーepoll

いくつかの詳細:私はファイルディスクリプタが通過する2つのプロセス間でIPCにboost ASIOを使用します。

は、ここではいくつかの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

私の理解では、私はエッジを使用しているとすると、私はfdが既に書き込み 操作のための準備ができている場合はブロックすることができます確かにね、モード(EPOLLET)、 を引き起こしたということです。

私は同意します。

問題は次のとおりです。Unixドメインソケットの書き込み準備ができている場合のデバッグ方法 操作ですか?コミット送信キューを検査 - あなたはデバッグシンボルとカーネルファイルを持っている場合は、あなたが

gdb vmlinux /proc/kcore 

/proc/net/unix

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

Num列からstruct sockアドレスとを行うことができ

バイト、その他の構造要素を使用して、ソケットの送信バッファに空きがあるかどうかを確認します。

しかし、straceの出力は、すでに次から最後の行にEPOLLOUTイベントを示しており、最後の行のこととepoll_waitの間で状況を変えることができるいかなるシステムコールはありませんので、実際にあなたがそれを行う必要はありません、私。 e。シグナルエッジはありません。ここではエッジトリガーを待つのは賢明ではないと思います。

関連する問題