在gtest中的不同线程中捕获信号
catching signals in different threads in gtest
我有一个多线程应用程序,我想测试向这些线程发送特定信号的行为(即验证 EINTR 错误是否发生在阻塞函数上)。
在线程中,我设置了如下内容:
struct sigaction sa {};
sa.sa_handler = func;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NODEFER;
sigaction(SIGUSR1, &sa, [](int){std::cout << "SIGUSR1 called\n";});
现在,如果我通过以下方式从 gtest 发送信号:
TEST(Thread, ThreadSignals) {
Thread test_thread;
std::future<int> future = std::async(&Thread::test, &test_thread);
ASSERT_NE(test_thread.get_id(), 0); // get_id() returns the id of the test_thread
ASSERT_NE(test_thread.get_id(), pthread_self());
pthread_kill(test_thread.get_id(), SIGUSR1);
}
gtests 以如下信号消息结束:
[ RUN ] Thread.ThreadSignals
User defined signal 1
,而不是预期的行为(例如打印消息)。在 gtest 之外,我对任务没有任何问题。
此外,在 TEST 案例中获取信号并没有阻止 gtest 退出。
我找到了设置,比如
// debugging information when fatal signals are raised.
GTEST_DECLARE_bool_(install_failure_signal_handler);
,但它们没有改变任何东西 - 或者我不知道,在哪里设置它们...
(我目前正在从 catch2 切换,因为我希望我可以在这里测试信号)
感谢任何建议!
原则上这是可行的。
我没有正确设置 sa_handler!
我有一个多线程应用程序,我想测试向这些线程发送特定信号的行为(即验证 EINTR 错误是否发生在阻塞函数上)。
在线程中,我设置了如下内容:
struct sigaction sa {};
sa.sa_handler = func;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NODEFER;
sigaction(SIGUSR1, &sa, [](int){std::cout << "SIGUSR1 called\n";});
现在,如果我通过以下方式从 gtest 发送信号:
TEST(Thread, ThreadSignals) {
Thread test_thread;
std::future<int> future = std::async(&Thread::test, &test_thread);
ASSERT_NE(test_thread.get_id(), 0); // get_id() returns the id of the test_thread
ASSERT_NE(test_thread.get_id(), pthread_self());
pthread_kill(test_thread.get_id(), SIGUSR1);
}
gtests 以如下信号消息结束:
[ RUN ] Thread.ThreadSignals
User defined signal 1
,而不是预期的行为(例如打印消息)。在 gtest 之外,我对任务没有任何问题。
此外,在 TEST 案例中获取信号并没有阻止 gtest 退出。 我找到了设置,比如
// debugging information when fatal signals are raised.
GTEST_DECLARE_bool_(install_failure_signal_handler);
,但它们没有改变任何东西 - 或者我不知道,在哪里设置它们...
(我目前正在从 catch2 切换,因为我希望我可以在这里测试信号)
感谢任何建议!
原则上这是可行的。 我没有正确设置 sa_handler!