pthread_sigmask用法及示例详解
pthread_sigmask的用法及注意事项,给一个c的示例
pthread_sigmask
用于设置线程的信号掩码,控制线程接收哪些信号。以下为详细用法、注意事项及示例代码:
用法
1 |
|
- 参数:
how
:操作类型,取值为SIG_BLOCK
(阻塞指定信号)、SIG_UNBLOCK
(解除阻塞)或SIG_SETMASK
(直接设置掩码)。set
:要操作的信号集合。oldset
:返回旧的信号掩码,可为NULL
。
- 返回值:成功返回
0
,失败返回错误码。
注意事项
- 线程独立性:每个线程有独立的信号掩码,新线程继承创建者的掩码。
- 专用信号线程:建议在专用线程中通过
sigwait
处理信号,其他线程阻塞相关信号。 - 信号竞争:确保信号处理线程在信号被阻塞后启动,避免竞态条件。
- 初始化信号集:使用
sigemptyset
和sigaddset
初始化信号集合。 - 错误检查:检查
pthread_sigmask
的返回值以确保成功。
示例代码
1 |
|
代码说明
- 主线程:
- 阻塞
SIGINT
和SIGTERM
,确保它们不会触发默认行为(如终止进程)。 - 创建专用线程处理信号。
- 阻塞
- 信号处理线程:
- 使用
sigwait
同步等待信号,避免异步信号处理的复杂性。 - 收到
SIGINT
(如 Ctrl+C)时退出循环,线程结束。
- 使用
运行示例
- 编译代码:
1
gcc example.c -lpthread -o example
- 运行程序:
1
./example
- 按下 Ctrl+C 触发
SIGINT
,程序输出:1
2
3Received signal: 2
Exiting...
Main thread exits.
通过合理使用 pthread_sigmask
,可以实现线程安全的信号处理机制,避免多线程环境下的信号竞争问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!