问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux进程间信号量的等待投递

发布网友 发布时间:2022-04-24 04:57

我来回答

1个回答

热心网友 时间:2023-10-30 03:50

每个信号量都具有一个非负的值,且信号量支持等待和投递操作。系统调用 semop 实现了这两个操作。它的第一个参数是信号量的标识符,第二个参数是一个包含 struct sembuf 类型元素的数组;这些元素指明了您希望执行的操作。第三个参数是这个数组的长度。结构体sembuf中包含如下字段:
sem_num将要执行操作的信号量组中包含的信号量数量。 sem_op是一个指定了操作类型的整数。 如果sem_op是一个正整数,则这个值会立刻被加到信号量的值上。 [BR]如果 sem_op 为负,则将从信号量值中减去它的绝对值。如果这将使信号量的值小于零,则这个操作会导致进程阻塞,直到信号量的值至少等于操作值的绝对值(由其它进程增加它的值)。 [BR]如果 sem_op 为0,这个操作会导致进程阻塞,直到信号量的值为零才恢复。 sem_flg 是一个符号位。指定 IPC_NOWAIT 以防止操作阻塞;如果该操作本应阻塞,则semop调用会失败。如果为sem_flg指定SEM_UNDO,Linux会在进程退出的时候自动撤销该次操作。 代码 5.4 展示了二元信号量的等待和投递操作。
代码 5.4 (sem_pv.c)二元信号量等待和投递操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 等待一个二元信号量。阻塞直到信号量的值为正,然后将其减1 */
int binary_semaphore_wait (int semid)
{
struct sembuf operations[1];
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0;
/* 减一。 */
operations[0].sem_op = -1;
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
/* 对一个二元信号量执行投递操作:将其值加一。 这个操作会立即返回。*/
int binary_semaphore_post (int semid)
{
struct sembuf operations[1];
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0;
/* 加一 */
operations[0].sem_op = 1;
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
指定 SEM_UNDO 标志解决当出现一个进程仍然持有信号量资源时被终止这种特殊情况时可能出现的资源泄漏问题。当一个进程被有意识或者无意识地结束的时候,信号量的值会被调整到“撤销”了所有该进程执行过的操作后的状态。例如,如果一个进程在被杀死之前减小了一个信号量的值,则该信号量的值会增长。

热心网友 时间:2023-10-30 03:50

每个信号量都具有一个非负的值,且信号量支持等待和投递操作。系统调用 semop 实现了这两个操作。它的第一个参数是信号量的标识符,第二个参数是一个包含 struct sembuf 类型元素的数组;这些元素指明了您希望执行的操作。第三个参数是这个数组的长度。结构体sembuf中包含如下字段:
sem_num将要执行操作的信号量组中包含的信号量数量。 sem_op是一个指定了操作类型的整数。 如果sem_op是一个正整数,则这个值会立刻被加到信号量的值上。 [BR]如果 sem_op 为负,则将从信号量值中减去它的绝对值。如果这将使信号量的值小于零,则这个操作会导致进程阻塞,直到信号量的值至少等于操作值的绝对值(由其它进程增加它的值)。 [BR]如果 sem_op 为0,这个操作会导致进程阻塞,直到信号量的值为零才恢复。 sem_flg 是一个符号位。指定 IPC_NOWAIT 以防止操作阻塞;如果该操作本应阻塞,则semop调用会失败。如果为sem_flg指定SEM_UNDO,Linux会在进程退出的时候自动撤销该次操作。 代码 5.4 展示了二元信号量的等待和投递操作。
代码 5.4 (sem_pv.c)二元信号量等待和投递操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 等待一个二元信号量。阻塞直到信号量的值为正,然后将其减1 */
int binary_semaphore_wait (int semid)
{
struct sembuf operations[1];
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0;
/* 减一。 */
operations[0].sem_op = -1;
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
/* 对一个二元信号量执行投递操作:将其值加一。 这个操作会立即返回。*/
int binary_semaphore_post (int semid)
{
struct sembuf operations[1];
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0;
/* 加一 */
operations[0].sem_op = 1;
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
指定 SEM_UNDO 标志解决当出现一个进程仍然持有信号量资源时被终止这种特殊情况时可能出现的资源泄漏问题。当一个进程被有意识或者无意识地结束的时候,信号量的值会被调整到“撤销”了所有该进程执行过的操作后的状态。例如,如果一个进程在被杀死之前减小了一个信号量的值,则该信号量的值会增长。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
提升学历选自考好还是成考好 成考和自考的文凭哪个好 2024年成人自考和成人高考哪个更好 家用净水器滤芯类型有哪些 家用净水器什么滤芯好 请问在VB中如何调用多线程? 交强险理赔后第二年上涨吗? 交强险出一次险第二年保费多出多少? 全家人都爱吃的家常菜目录 丽台Quadro P5000专业图形显卡-购买最佳价格 平时穿鞋43码 AJ1穿44.5码能穿吗? 脚胖穿aj1会撑变形吗 sem_t的相关应用 42.5的脚穿44.5的aj1能穿吗 信号量的基本流程 关于linux下的多线程使用sem信号量的运行问题 linux 信号量问题 编译错误 好像不识别sem_t定义的变量 买aj1要大一码吗 linux编程时的信号量问题。 我以前用过的信号量头文件是&lt;semaphore.h&gt;,而现在又发现还有个&lt;sys&#47;sem.h&gt; aj1矮帮穿的脚侧面疼 什么叫信号量?它由哪几部分组成?信号量的值有什么含义 aj1鞋码偏大还是偏小? sem_t的初始化信号量 为什么AJ1有些显得脚宽 linux/sem.h和sys/sem.h有什么区别 aj1鞋码脚宽8.1cm是脚宽么 aj1鞋码偏大还是偏小 女生37码的脚aj1穿多大? 买aj1 我脚实际是41.5,平时nike我都是买42,aj1要买多大?42.5可以吗? aj1脚胖的人可以穿吗 WaitForSingleObject怎么使用,想用它在windows环境下实现类似linux下的sem_wait功能。 电动车控制器MOS管型号是:SEM8512c SMRY H436不知道好不好、比同产品的怎么样 关于一个中断函数的疑惑? 怎么写避免死锁的算法 semxenhtructuyen struct time_list ,LIST_HEAD(MINE) ,DECLARE_MUTEX(sem) ,spinlock_t ,atomic_t spin_unlock(&m)在哪个头 这个符号在哪 这个符号word符号里面在哪项能找到啊? (~)这符号在哪? 这个符号在那里找 怎么找不到 表格里“口”这个符号在哪? 这个符号在哪里? 请问这个符号在键盘会哪里 \这个符号在哪 这个符号在哪找@___和谐号__ 电脑上“………”这个符号在哪 这个符号是在哪里呀谁能告诉我,谢谢 干面条多久煮熟 干挂面煮几分钟能熟 热干面干面条要煮多长时间