我正在将一个多线程应用程序从 HP-UX 迁移到 Solaris,到目前为止,除了一件事外一切正常!该应用程序有一个处理信号的线程,当接收到其中一些信号时,它会运行一些清理(日志记录、终止子进程等)。
我尽可能地减少了代码,以制作一个简单的示例来说明问题:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <synch.h>
#include <iostream>
#include <unistd.h>
using namespace std;
pthread_t m_signalHandlerThread;
sigset_t m_signalSet;
void signalHandler()
{
while ( true )
{
cout << "SigWait..." << endl;
sigwait( &m_signalSet, &sig );
cout << "Signal!! : " << sig << endl;
break;
}
cout << "OUT" << endl;
}
void* signalHandlerThreadFunction( void* arg )
{
signalHandler();
return (void*)0;
}
int main()
{
sigemptyset( &m_signalSet );
sigaddset( &m_signalSet, SIGQUIT ); //kill -QUIT
sigaddset( &m_signalSet, SIGTERM ); //kill
sigaddset( &m_signalSet, SIGINT ); //ctrl-C
sigaddset( &m_signalSet, SIGHUP ); //reload config
if ( pthread_create( &m_signalHandlerThread, NULL, signalHandlerThreadFunction, NULL ) )
{
cout << "cannot create signal handler thread, system shut down.\n" << endl;
}
int iTimeout = 0;
while (1)
{
if (iTimeout >= 10)
break;
sleep(1);
iTimeout++;
cout << "Waiting... " << iTimeout << endl;
}
cout << "END" << endl;
exit (0);
}
使用编译命令行: 索拉里斯:
CC -m64 -g temp.cpp -D_POSIX_PTHREAD_SEMANTICS -lpthread
惠普用户体验:
/opt/aCC/bin/aCC +p +DA2.0W -AA -g -z -lpthread -mt -I/usr/include temp.cpp
运行两个应用程序,行为(在 10 秒循环中按 CTRL+C):
惠普用户体验:
./a.out
SigWait...
Waiting... 1
Waiting... 2
Signal!! : 2 <---- CTRL + C
OUT
Waiting... 3
Waiting... 4 <---- CTRL + C again to terminate
索拉里:
./a.out
SigWait...
Waiting... 1
Waiting... 2 <---- CTRL + C
^C
任何帮助都将受到欢迎,因为我的头发已经撕裂了(剩下的不多了):)!
谢谢!
最佳答案
未指定您的 2 个线程中的哪一个将处理 SIGINT。如果您只需要一个线程来处理信号,则需要在您拥有的所有其他线程中阻止该信号。
关于c++ - HP-UX 和 Solaris 10 之间的 POSIX 线程行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977188/