我有一些代码会定期调用recv()
(带有MSG_DONTWAIT
标志)。我很好奇,因为在vtune中分析我的代码,我看到与sigprocmask()
相关联的recv()
调用,并且它占用了总时间的很大一部分来执行。我很好奇为什么recv()
正在调用sigprocmask()
。
答案 0 :(得分:1)
在linux下使用TCP套接字时,如果对方意外关闭,您将收到SIGPIPE。
因为你可以屏蔽这个信号(大多数情况下,你自己会处理0的返回值,你不关心这个信号),我猜系统库检查信号状态,如果被屏蔽,则使用更快的代码路径。
如果没有,则无法优化。
顺便说一下,你知道pselect()对吗?答案 1 :(得分:0)
可能因此recv可以判断是否生成了相关信号,否则如果所述信号被阻止则不会被看到。 EAGAIN / EWOULDBLOCK作为errno的值而浮现在脑中,有时使用可能被阻塞的信号生成。你看过sigprocmask
man page了吗?