c - 信号和信号量系统 V
问题描述
我正在用 C 语言在 Unix 上编程。
我有 3 个关键区域:
Mutex1 -> Lock
{
{ ZONE1
{
Mutex1 -> unLock
Mutex2 -> Lock
{
{ ZONE2
{
Mutex2 -> unLock
Mutex3 -> Lock
{
{ ZONE3
{
Mutex3 -> unLock
对于每个区域,都有一个互斥体。N 个进程执行此代码,因此需要互斥锁来管理关键区域。我的问题是:
SIGINT 就是这样处理的 -> signal(SIGINT, handler);
void handler(int sign)
{
exit(0);
}
如果一个进程在单个关键区域收到信号(例如 ctrl+c),我需要解锁互斥锁,仅考虑进程在收到信号时所处的位置(区域 1、区域 2 或区域 3)。
我能做些什么来做到这一点?
解决方案
一种选择是使用sigprocmask()阻止关键部分周围的信号。这样,您可以将信号响应限制在非关键区域。
如果您需要信号来影响您的关键部分,那么您可以与信号处理程序进行通信 à la:
volatile sigstate;
void handler(int signo) {
if (sigstate & 1) {
sigdefcount++;
} else {
_exit(1);
}
}
请注意,从信号处理程序调用exit()是不安全的;它必须是_exit()。有了这个,你的关键部分的代码应该设置 sigstate 标志,并定期检查计数。这很快就变得复杂了,因为许多系统调用默认会在中断时安静地重新启动,并且您可能需要阻塞具有超时的接口,以便您可以检查此指标。
在大多数情况下,最好简化关键部分以具有可预测的执行时间并禁用其中的信号。这可能涉及将一些关键部分拆分为子部分,如果做更多的工作,这可能是一个更清晰的设计。
推荐阅读
- c# - WebRequest & Response 的错误处理
- dask - xarray 合并缓慢似乎无法结合不同的 lat lon netcdf
- vb.net - 将两个关键字过滤器应用于 Datagridview 中的 SINGLE 列。VB
- android - 使用 Activity 上下文依赖注入 ViewModel
- r - R - 在数据框中的变量之间动态切换?
- php - 如何在不刷新页面的情况下使用 POST Ajax 更新 PHP 字符串?
- c# - MainPage.OnStart() 找不到合适的方法来覆盖
- python - 从获取请求中解析结果
- python - 如何在熊猫中分组后过滤值
- c++ - 如何修复 C++ gcc 编译警告以填充结构