判断sem信号量为零_将信号量递减为零的进程崩溃时,如何恢复信号量?

我有多个使用g ++编译的应用程序,它们在Ubuntu中运行。我正在使用命名信号量来协调不同进程之间的关系。

除非 出现以下情况, 否则

所有方法都可以正常工作:如果其中一个进程调用sem_wait()或sem_timedwait()使信号量递减,然后在有机会调用之前崩溃或被杀死-9

sem_post(),则从那时起,命名的信号量“将无法使用”。

“不可用”,我的意思是信号量现在为零,应该将其增加到1的进程已经死亡或被杀死。

我找不到sem_*()可能告诉我上次递减的进程崩溃的API。

我在某处缺少API吗?

这是我打开命名信号量的方法:

sem_t *sem = sem_open( "/testing",

O_CREAT | // create the semaphore if it does not already exist

O_CLOEXEC , // close on execute

S_IRWXU | // permissions: user

S_IRWXG | // permissions: group

S_IRWXO , // permissions: other

1 ); // initial value of the semaphore

这是我递减的方法:

struct timespec timeout = { 0, 0 };

clock_gettime( CLOCK_REALTIME, &timeout );

timeout.tv_sec += 5;

if ( sem_timedwait( sem, &timeout ) )

{

throw "timeout while waiting for semaphore";

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 中,可以使用 `semctl` 系统调用中的 `GETVAL` 命令来获取指定信号的值。如果该值为0,则表示信号已经被占用,没有可用的资源。 具体的代码实现可以参考如下示例: ```c #include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int main() { int semid; struct sembuf sb; // 创建信号semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } // 初始化信号 if (semctl(semid, 0, SETVAL, 1) == -1) { perror("semctl"); exit(EXIT_FAILURE); } // 获取信号的值 printf("Sem value: %d\n", semctl(semid, 0, GETVAL)); // 尝试获取信号 sb.sem_num = 0; sb.sem_op = -1; // P 操作 sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(EXIT_FAILURE); } printf("Semaphore acquired\n"); // 释放信号 sb.sem_op = 1; // V 操作 if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(EXIT_FAILURE); } printf("Semaphore released\n"); // 删除信号集 if (semctl(semid, 0, IPC_RMID, 0) == -1) { perror("semctl"); exit(EXIT_FAILURE); } return 0; } ``` 在这个示例中,我们首先使用 `semget` 系统调用创建了一个信号集,并使用 `semctl` 系统调用对该信号进行了初始化。然后使用 `semctl` 系统调用获取了该信号的值,并输出到控制台。 接下来,我们使用 `semop` 系统调用进行了一次 P 操作,即尝试获取该信号。如果该信号的值为0,则该操作将会被阻塞,直到信号的值变为非0。在本例中,由于我们已经将信号初始化为1,因此该 P 操作可以顺利完成。 最后,我们使用 `semop` 系统调用进行了一次 V 操作,即释放该信号。然后使用 `semctl` 系统调用删除了该信号集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值