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

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

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

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

如果没有,它不能优化。

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

可能如此recv可以告诉相关的信号是否产生,否则不会看到如果说信号被阻止。 EAGAIN / EWOULDBLOCK是errno的值,它们有时是使用可能被阻塞的信号产生的。 你看过sigprocmask手册页吗?