unionsem是什么?新手小白入门指南看这篇!

吉云

最近在搞操作系统这块儿,学到那个存储管理,真是把我给整懵。尤其是那个信号量集,还有共享内存,头都大。不过还我这人就喜欢边学边记,今天就来跟大家伙儿分享一下我折腾 unionsem 的过程。

初识 unionsem

我是连这是个啥玩意儿都不知道。后来一查,,原来是个联合体类型,还是用来操作信号量的。这玩意儿在<sys/sem.h>头文件里头定义着。

unionsem是什么?新手小白入门指南看这篇!

看它的定义:

typedef union semun {

int val; / Value for SETVAL /

struct semid_ds buf; / Buffer for IPC_STAT /

unionsem是什么?新手小白入门指南看这篇!

当时我就琢磨,这啥意思?又是 val,又是 buf 的? 后来查些资料,慢慢地,算是摸着点门道。

实践出真知

光看定义肯定不行,还是得动手实践。我先是照着网上的例子,敲一段代码:

unionsem是什么?新手小白入门指南看这篇!

union semun sem_union;

sem_* = 1;

这一步,我理解是给信号量赋个初始值,设成 1。就好像一把锁,一开始是开着的。

然后,我又试着用 semctl 函数去操作这个信号量:

unionsem是什么?新手小白入门指南看这篇!

int semid = semget(...); // 先得获取一个信号量 ID

semctl(semid, 0, SETVAL, sem_union); // 用 semctl 设置信号量的值

这里,semctl 就是那个关键的函数,它可以对信号量做各种操作。我这里用的是 SETVAL,就是设置信号量的值。

遇到的坑

学习过程中我也不是一帆风顺。 比如,刚开始不知道在哪里定义union semun,直接写到主函数,发现不行,会报错,提醒我说没有定义。

unionsem是什么?新手小白入门指南看这篇!

后来查资料,才知道这玩意儿得定义成全局变量或者这样类似的。

还有,就是对 semctl 函数的理解,一开始也是稀里糊涂的。它的参数都是啥意思?每个参数该怎么用?这都得一个个去查,去试。实践过程中发现要用第四个参数,必须自己定义 union semun。

一点感悟

这回折腾 unionsem,让我对信号量有更深的理解。以前觉得这玩意儿很抽象,现在感觉具体多。而且我也体会到,学习这些底层的东西,光看书是不行的,必须得动手实践,多敲代码,多调试。只有这样,才能真正掌握它们。

unionsem是什么?新手小白入门指南看这篇!

我现在也只是个初学者,对 unionsem 的理解还很浅显。以后,我还会继续学习,继续实践,争取把这块儿知识彻底搞懂。

今天的分享就到这里。希望我的这点经验,能对大家有所帮助。如果大家有什么问题,或者有什么更好的经验,也欢迎留言交流,咱们一起学习,一起进步!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]