c - 信号和信号量系统V

标签 c unix signals mutex semaphore

我正在 Unix 上用 C 进行编程。

我有 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() 来阻止关键部分周围的信号。这样您就可以将信号响应限制在非关键区域。

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

volatile sigstate;

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

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

在大多数情况下,最好简化关键部分以获得可预测的执行时间并禁用其中的信号。这可能涉及将一些关键部分分成几个小部分,如果多做一点工作,这可能是一个更清晰的设计。

关于c - 信号和信号量系统V,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473955/

相关文章:

c - 迭代可能信号的列表

c - 二叉搜索树插入在 C 中无法正常运行(可能是无知错误)

c - 有没有一种方法可以在文件中找到字符时自动声明变量

c - 我是否使用了 tm/mktime 错误,如果没有,是否有解决方法?

linux - 从 shell 脚本中调用 Curl

linux - 信号如何中断系统调用

c - 共享缓冲区进程

c - 进程在读取时挂起

c - 链接到 gcc 中的库

c - 为什么我不能调用函数信号返回的函数(信号处理程序)?