我有麻烦试图处理的信号...无法处理信号,导致interruped系统调用
我有一个多线程应用程序,它接收中断系统在我使用的是库调用的信号。经过一番研究,我发现如果信号没有被处理,它会被发送到应用程序中的随机线程。我已经从我使用的库中证实,他们在应用程序中没有使用任何信号。我也没有。这是我的主要驱动程序类别:
void sig_handler(int signum)
{
cout << "Signal Handle: " << signum << endl;
signal(signum, SIG_IGN);
}
class Driver
{
public:
Driver();
void LaunchLog();
void logonListen();
};
Driver::Driver()
{
pthread_t logThread;
pthread_create(&logThread, NULL, LaunchLogThread, (void*) this);
pthread_detach(logThread);
pthread_t listenThread;
pthread_create(&listenThread, NULL, LaunchListenThread, (void*)this);
pthread_detach(listenThread);
bool running = true;
while(running)
{
//Simple loop to resemble a menu for the console
}
}
void Driver::logonListen()
{
char buffer[256];
int logonPort = BASEPORT;
int sockfd;
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen;
//initialize socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0){
perror("Error opening socket");
exit(1);
}
bzero((char*)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(logonPort);
//bind socket to our address
if(bind(sockfd,(struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)
{
perror("Error on bind");
exit(1);
}
clilen = sizeof(struct sockaddr_in);
int n;
int nextUser = 2;
char reply[32];
while(1)
{
//Wait for incoming connection on a socket
}
}
void Driver::LaunchLog()
{
Logger::Instance()->WriteToFile();
}
void* LaunchListenThread(void* ptr)
{
Driver* driver = (Driver*) ptr;
driver->logonListen();
}
int main()
{
signal (SIGHUP, sig_handler);
signal (SIGINT, sig_handler);
signal (SIGQUIT, sig_handler);
signal (SIGILL, sig_handler);
signal (SIGTRAP, sig_handler);
signal (SIGFPE, sig_handler);
signal (SIGKILL, sig_handler);
signal (SIGUSR1, sig_handler);
signal (SIGSEGV, sig_handler);
signal (SIGUSR2, sig_handler);
signal (SIGPIPE, sig_handler);
signal (SIGALRM, sig_handler);
signal (SIGTERM, sig_handler);
signal (SIGCHLD, sig_handler);
signal (SIGCONT, sig_handler);
signal (SIGSTOP, sig_handler);
signal (SIGTSTP, sig_handler);
signal (SIGTTIN, sig_handler);
signal (SIGTTOU, sig_handler);
signal (SIGABRT, sig_handler);
Driver driver;
return 0;
}
我无法处理信号。中断的系统调用继续爬行,并且我的信号处理程序从不被使用。即使在控制台中按CTRL + C,程序也会以中断而非SIGINT处理结束。我是否正确安装处理程序?
有没有办法处理所有的信号,并忽略它们,如果它们出现?
谢谢
如果它的多线程处理此问题?我将SIGINT发送到gdb的应用程序中,但它只是结束应用程序而不是进入我的处理程序。我明白你对SIGINT的意思,我试图找到并消除信号的来源,这就是为什么我试图做到这一点。 – Joshua
由于我在Makefile中打开了-pg(分析),信号最终成为了SIGPROF。无法使用调试器来确定它。你能否详细说明我将如何做到这一点? – Joshua
@Joshua,以及gdb,你可以使用'handle all stop'命令让调试器拦截所有的信号并停止程序。然后运行该程序并查看发生了什么信号。在多线程程序中,每个信号只能设置一个信号处理程序,这适用于所有线程。 –