信号和信号量系统V

时间:2019-10-20 14:23:52

标签: c unix signals mutex semaphore

我正在用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)。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

一种选择是使用 sigprocmask()阻止关键区域周围的信号。这样,您可以将信号响应限制在非关键区域。

如果您需要信号来影响关键部分,则可以与信号处理程序àla进行通信:

volatile sigstate;

void handler(int signo) {
    if (sigstate & 1) {
          sigdefcount++;
    } else {
          _exit(1);
    }
}

请注意,从信号处理程序中调用 exit()并不安全;它必须是 _exit()。这样,关键部分中的代码应设置sigstate标志,并定期检查计数。这很快变得很复杂,因为许多系统调用默认情况下会在中断时自动安静地重新启动,并且您可能需要使用超时来阻止接口,以便可以检查此指示器。

在大多数情况下,最好简化关键部分,使其具有可预测的执行时间并禁用其中的信号。这可能涉及将一些关键部分划分为多个子部分,如果需要更多的工作,这可能是更清晰的设计。