在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!