最近在搞操作系统这块儿,学到那个存储管理,真是把我给整懵。尤其是那个信号量集,还有共享内存,头都大。不过还我这人就喜欢边学边记,今天就来跟大家伙儿分享一下我折腾 unionsem 的过程。
初识 unionsem
我是连这是个啥玩意儿都不知道。后来一查,,原来是个联合体类型,还是用来操作信号量的。这玩意儿在<sys/sem.h>
头文件里头定义着。
看它的定义:
typedef union semun {
int val; / Value for SETVAL /
struct semid_ds buf; / Buffer for IPC_STAT /
当时我就琢磨,这啥意思?又是 val,又是 buf 的? 后来查些资料,慢慢地,算是摸着点门道。
实践出真知
光看定义肯定不行,还是得动手实践。我先是照着网上的例子,敲一段代码:
union semun sem_union;
sem_* = 1;
这一步,我理解是给信号量赋个初始值,设成 1。就好像一把锁,一开始是开着的。
然后,我又试着用 semctl
函数去操作这个信号量:
int semid = semget(...); // 先得获取一个信号量 ID
semctl(semid, 0, SETVAL, sem_union); // 用 semctl 设置信号量的值
这里,semctl
就是那个关键的函数,它可以对信号量做各种操作。我这里用的是 SETVAL
,就是设置信号量的值。
遇到的坑
学习过程中我也不是一帆风顺。 比如,刚开始不知道在哪里定义union semun
,直接写到主函数,发现不行,会报错,提醒我说没有定义。
后来查资料,才知道这玩意儿得定义成全局变量或者这样类似的。
还有,就是对 semctl
函数的理解,一开始也是稀里糊涂的。它的参数都是啥意思?每个参数该怎么用?这都得一个个去查,去试。实践过程中发现要用第四个参数,必须自己定义 union semun。
一点感悟
这回折腾 unionsem,让我对信号量有更深的理解。以前觉得这玩意儿很抽象,现在感觉具体多。而且我也体会到,学习这些底层的东西,光看书是不行的,必须得动手实践,多敲代码,多调试。只有这样,才能真正掌握它们。
我现在也只是个初学者,对 unionsem 的理解还很浅显。以后,我还会继续学习,继续实践,争取把这块儿知识彻底搞懂。
今天的分享就到这里。希望我的这点经验,能对大家有所帮助。如果大家有什么问题,或者有什么更好的经验,也欢迎留言交流,咱们一起学习,一起进步!