在錯誤情況下,我想允許子線程發出一個信號,然後由父線程捕獲該信號。另一個線程然後安全地終止整個過程。我看到的問題是,如果我在創建過程中使用pthread_sigmask阻止子線程接收信號,那麼它引發的信號不會被其他線程看到。這是預期的行爲?我能做些什麼呢?子線程提高它忽略的信號
我檢查了here和其他許多人喜歡它,但他們處理的信號源於外部過程。
示例代碼如下,請原諒在信號處理程序中使用不允許的函數,因爲它便於舉例。我在這裏使用了SIGABRT,因爲它有一個非常明顯的默認處理程序,但如果使用SIGUSR1,行爲是相同的。
#include <unistd.h>
#include <signal.h>
#include <iostream>
#include <thread>
void sigHandler(int)
{
std::cout << "Caught signal in " << std::this_thread::get_id() << std::endl;
}
void threadMain()
{
std::cout << "Child is " << std::this_thread::get_id() << std::endl;
sleep(1);
raise(SIGABRT);
std::cout << "Child exiting" << std::endl;
}
int main(int argc, char** argv)
{
std::cout << "Parent is " << std::this_thread::get_id() << std::endl;
struct sigaction psa;
psa.sa_handler = sigHandler;
sigaction(SIGABRT, &psa, nullptr);
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGABRT);
if (argc > 1)
{
if (pthread_sigmask(SIG_BLOCK, &set, NULL) == 0)
std::cout << "Masking complete" << std::endl;
else
std::cout << "Failed to mask" << std::endl;
}
std::thread child(threadMain);
if (argc > 1)
{
if (pthread_sigmask(SIG_UNBLOCK, &set, NULL) == 0)
std::cout << "Unmask complete" << std::endl;
else
std::cout << "Failed to mask" << std::endl;
}
sleep(2);
child.join();
}
如果您編譯
g++ --std=c++11 -lpthread main.cpp -g -o main
與./main
運行輸出是:
Parent is 140042782496544
Child is 140042766427904
Caught signal in 140042766427904
Child exiting
所以信號被抓住了,但孩子(不是父,像我通緝)。如果您有./main 1
運行它的輸出是:
Parent is 140070068569888
Masking complete
Unmask complete
Child is 140070052501248
Child exiting
即信號堵塞了,所以孩子沒看出來(這是我想要的東西),但家長沒看到。
如何確保信號由小孩撫養並且由父母撫養?
爲什麼不使用C++異常? –