面试题答案
一键面试- 实现思路:
- 使用
pthread_sigmask
函数来设置信号屏蔽。在主线程中屏蔽信号,在子线程中恢复默认的信号处理方式(不屏蔽信号)。 - 主线程创建子线程时,需要确保子线程继承主线程的信号屏蔽状态(默认是继承的),然后在子线程中解除对信号的屏蔽。
- 使用
- 主要代码框架:
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
// 子线程函数
void* child_thread(void* arg) {
sigset_t set;
// 清空信号集
sigemptyset(&set);
// 设置子线程不屏蔽任何信号
pthread_sigmask(SIG_SETMASK, &set, NULL);
while(1) {
// 子线程正常工作内容
printf("Child thread is running...\n");
sleep(1);
}
return NULL;
}
int main() {
pthread_t tid;
sigset_t set;
// 清空信号集
sigemptyset(&set);
// 添加要屏蔽的信号,这里以SIGINT为例
sigaddset(&set, SIGINT);
// 主线程屏蔽信号
pthread_sigmask(SIG_BLOCK, &set, NULL);
// 创建子线程
if (pthread_create(&tid, NULL, child_thread, NULL) != 0) {
perror("pthread_create");
return 1;
}
// 主线程执行关键代码,这里以一个循环模拟
for (int i = 0; i < 5; i++) {
printf("Main thread is running critical code...\n");
sleep(1);
}
// 主线程关键代码执行完毕,恢复信号处理(这里只是示例,实际可能根据需求调整)
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
// 等待子线程结束
pthread_join(tid, NULL);
return 0;
}
在上述代码中:
main
函数中,主线程先屏蔽SIGINT
信号,然后创建子线程。- 子线程函数
child_thread
中,解除对信号的屏蔽,这样子线程可以正常响应信号。 - 主线程执行完关键代码后,解除对信号的屏蔽。最后主线程等待子线程结束。