首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确处理信号,从而使gperftools分析器仍能工作?

如何正确处理信号,从而使gperftools分析器仍能工作?
EN

Stack Overflow用户
提问于 2013-10-25 05:52:45
回答 2查看 1.2K关注 0票数 5

我想分析一下我的守护进程程序,它暂停了主线程:

代码语言:javascript
运行
复制
sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGTERM);
sigaddset(&signal_mask, SIGINT);

int sig;
sigwait(&signal_mask, &sig);

所有其他线程只需阻塞所有信号。据我所知,分析器使用SIGPROF信号进行操作。如果我开始使用这样的代码进行分析,输出.prof文件是空的:

env CPUPROFILE=daemon.prof ./守护进程

如何正确处理主线程和其他线程中的信号以启用分析?或者可能是其他地方的问题?

EN

回答 2

Stack Overflow用户

发布于 2016-07-21 07:34:31

所有其他线程只需阻塞所有信号。

您只需在所有线程(或您想要配置的线程中)中取消阻止SIGPROF。我们刚刚在多线程守护进程中解决了完全相同的问题。

票数 1
EN

Stack Overflow用户

发布于 2014-04-10 19:28:57

我需要看到更多您的代码,但是您所说的“所有其他线程只是阻塞所有信号”的声明raises...signals。

您必须记住,大多数系统调用都是在线程概念存在之前创建的。信号处理就是其中之一。因此,当您在任何线程上阻塞一个信号时,它可能会被所有线程阻塞。

实际上,请查看信号(2)手册:

代码语言:javascript
运行
复制
The effects of signal() in a multithreaded process are unspecified.

是的,这是可悲的,但这是你必须付出的代价,使用一个低开销的统计抽样分析器。而且它的工作非常容易:只要从信号掩码集中移除SIGPROF (或SIGALRM,如果您正在使用真正的模式),您应该会没事。

通常,除非您绝对必须这样做,否则您不应该在主thread...where " main“之外的任何东西中进行进程级信号掩蔽,这并不一定意味着MAIN()运行在其中的线程,而是指您认为它是所有其他线程中的”老板“的线程,因为您已经说得太清楚了。:)

您也可以尝试使用西格曼面具,但我不清楚它在诸如子线程从σ掩码中删除条目的情况下工作得有多好(线程继承父线程的p线程σ掩码)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19582060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档