实验内容:探究线程崩溃与进程状态的关系
实验结论:
1)当线程崩溃的时候,会产生11号SIGSEGV信号,该信号会使进程崩溃退出;
2)但是如果对SIGSEGV信号捕捉后,就会正常运行下去。
/*
实验过程:进程中创建3个子线程,并执行死循环。子线程执行的回调函数为work函数,使子线程产生SIGSEGV信号,1)不对信号进行处理,直接观察输出;2)对信号进行捕捉,观察输出。
实验结果:1)进程自动退出;2)进程继续运行
*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
void sigsegv_handler() {
printf("捕捉到sigsegv信号\n");
sleep(1);
}
void* work() {
printf("子线程创建成功\n");
int i = 0;
// 触发SIGSEGV信号
char *p = NULL;
while(1)
{
printf("%s:[%s]:[%d]\n", __DATE__, __func__, __LINE__);
sleep(1);
i++;
if(3 == i){
*p = 0x55;
}
}
}
int main() {
signal(SIGSEGV, &sigsegv_handler);
pthread_t p_ids[3];
for (int i = 0; i < 3; i++) {
pthread_create(&(p_ids[i]), NULL, &work, NULL);
}
while (1) {
printf("进程正常运行\n");
sleep(1);
}
return 0;
}