6

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

4

2 回答 2

1

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

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

如果不是,则无法优化。

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

于 2012-10-29T11:51:28.027 回答
0

可能这样 recv 可以判断是否生成了相关信号,否则如果所述信号被阻塞,则不会看到这些信号。想到 EAGAIN/EWOULDBLOCK 作为 errno 的值,有时使用可能被阻塞的信号生成。你看过sigprocmask手册页吗?

于 2012-05-11T15:48:58.120 回答