我想分析一下我的守护进程程序,它暂停了主线程:
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 ./守护进程
如何正确处理主线程和其他线程中的信号以启用分析?或者可能是其他地方的问题?
发布于 2016-07-21 07:34:31
所有其他线程只需阻塞所有信号。
您只需在所有线程(或您想要配置的线程中)中取消阻止SIGPROF。我们刚刚在多线程守护进程中解决了完全相同的问题。
发布于 2014-04-10 19:28:57
我需要看到更多您的代码,但是您所说的“所有其他线程只是阻塞所有信号”的声明raises...signals。
您必须记住,大多数系统调用都是在线程概念存在之前创建的。信号处理就是其中之一。因此,当您在任何线程上阻塞一个信号时,它可能会被所有线程阻塞。
实际上,请查看信号(2)手册:
The effects of signal() in a multithreaded process are unspecified.是的,这是可悲的,但这是你必须付出的代价,使用一个低开销的统计抽样分析器。而且它的工作非常容易:只要从信号掩码集中移除SIGPROF (或SIGALRM,如果您正在使用真正的模式),您应该会没事。
通常,除非您绝对必须这样做,否则您不应该在主thread...where " main“之外的任何东西中进行进程级信号掩蔽,这并不一定意味着MAIN()运行在其中的线程,而是指您认为它是所有其他线程中的”老板“的线程,因为您已经说得太清楚了。:)
您也可以尝试使用西格曼面具,但我不清楚它在诸如子线程从σ掩码中删除条目的情况下工作得有多好(线程继承父线程的p线程σ掩码)。
https://stackoverflow.com/questions/19582060
复制相似问题