为什么在调用recv系统调用时调用sigprocmask?

时间:2012-05-10 22:22:55

标签: c++ linux

我有一些代码会定期调用recv()(带有MSG_DONTWAIT标志)。我很好奇,因为在vtune中分析我的代码,我看到与sigprocmask()相关联的recv()调用,并且它占用了总时间的很大一部分来执行。我很好奇为什么recv()正在调用sigprocmask()

2 个答案:

答案 0 :(得分:1)

在linux下使用TCP套接字时,如果对方意外关闭,您将收到SIGPIPE。

因为你可以屏蔽这个信号(大多数情况下,你自己会处理0的返回值,你不关心这个信号),我系统库检查信号状态,如果被屏蔽,则使用更快的代码路径。

如果没有,则无法优化。

顺便说一下,你知道pselect()对吗?

答案 1 :(得分:0)

可能因此recv可以判断是否生成了相关信号,否则如果所述信号被阻止则不会被看到。 EAGAIN / EWOULDBLOCK作为errno的值而浮现在脑中,有时使用可能被阻塞的信号生成。你看过sigprocmask man page了吗?