我在 C++ 中使用 pthread 编写了一个具有 3 个线程的程序。当其中一个线程发生缓冲区溢出时,整个程序终止,其他线程无法运行,并显示此消息:*** stack smashing detected ***: ./a.out terminated
我想堆栈粉碎只杀死其中发生 BOF 的线程,其他线程保持活动状态。所以,我尝试忽略信号,但这并没有解决我的问题。
这是我的程序:
#include <unistd.h>
#include <pthread.h>
#include <iostream>
#include <signal.h>
#include <string.h>
using namespace std;
int a = 0;
void sig_func(int sig)
{
}
void *func (void *arg)
{
int c = a++;
cout << "start thread " << c << endl;
if (c == 1)
{
char stuff[8];
strcpy(stuff, "123456789");
}
cout << "end thread " << c << endl;
}
int main ()
{
pthread_t tid1, tid2, tid3;
for(int i = 1; i <=31 ; i++) //this line ignores all signals from 1 to 31.
signal(i,sig_func);
pthread_create (&tid1, 0, func, 0);
sleep (1);
pthread_create (&tid2, 0, func, 0);
sleep (1);
pthread_create (&tid3, 0, func, 0);
sleep (1);
return 0;
}
当我用 编译它时g++ a.cpp -lpthread
,输出是这样的:
start thread 0
end thread 0
start thread 1
end thread 1
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)
有没有什么办法可以将堆栈粉碎只导致杀死其中发生BOF的线程,并且程序不会终止?
请注意,我不想使用-fno-stack-protector
选项编译我的程序以避免受金丝雀保护。