【问题标题】:Why is sigprocmask called when calling the recv system call?为什么调用recv系统调用时会调用sigprocmask?
【发布时间】:2012-10-29 19:51:28
【问题描述】:

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

【问题讨论】:

  • 我们能否看到重现此行为的最小可能代码的相关痕迹?我们也可以看到那个演示代码吗?准确地看到对信号掩码做了什么会很有启发性。
  • 您能否详细说明这些对recv() 的调用的背景?你用的是什么类型的插座?你是直接打电话给recv()吗?

标签: c++ linux


【解决方案1】:

在linux下使用TCP socket时,如果对方意外关闭,你会收到SIGPIPE。

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

如果不是,则无法优化。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Brainfart,我的意思是错误。谢谢。有时会根据处理的信号生成错误。
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2017-03-20
    • 2015-10-05
    相关资源
    最近更新 更多