我有一些代码定期调用recv()
(带有MSG_DONTWAIT
标志)。 我很好奇,因为在vtune中分析我的代码,我看到一个与recv()
相关的sigprocmask()
调用,并且占用了大部分的总执行时间。 我很好奇为什么recv()
正在调用sigprocmask()
。
在linux下使用TCP套接字时,如果另一端意外关闭,您将收到SIGPIPE。
既然你可以屏蔽这个信号(大部分时间,你会自己处理返回值0,你不关心这个信号),我猜系统库检查信号状态,如果屏蔽,使用更快的代码路径。
如果没有,它不能优化。
顺便说一句,你知道pselect()对不对?
可能如此recv可以告诉相关的信号是否产生,否则不会看到如果说信号被阻止。 EAGAIN / EWOULDBLOCK是errno的值,它们有时是使用可能被阻塞的信号产生的。 你看过sigprocmask
手册页吗?