资讯专栏INFORMATION COLUMN

go :"os/signal"源码解析

bigdevil_s / 1520人阅读

摘要:最近在学习语言,基本语法熟悉之后,想看一些开源项目,于是就找到了,在看源码的时候,对进行了阅读,一下内容仅供参考。源码这种事情,还是可以多带带拿出来,针对看不懂的地方进行调试,快速的了解。

最近在学习go语言,基本语法熟悉之后,想看一些开源项目,于是就找到了NSQ,在看NSQ源码的时候,对signal进行了阅读,一下内容仅供参考。
linux信号量知识点

图中可以看到信号来一共是62个,32和33没有

非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

1到31号都是不可靠信号

go 语言singnal的源码(部分)
    type handler struct {
    mask [(numSig + 31) / 32]uint32
    }
    
    func (h *handler) want(sig int) bool {
        return (h.mask[sig/32]>>uint(sig&31))&1 != 0
    }

    func (h *handler) set(sig int) {
        h.mask[sig/32] |= 1 << uint(sig&31)
    }

    func (h *handler) clear(sig int) {
        h.mask[sig/32] &^= 1 << uint(sig&31)
    }

type handler struct :定义了处理信号量的数据结构,mask [(numSig + 31) / 32]uint32中numSig是65,所以就是一个2个元素的数组,元素类型是uint32位的,4字节

set函数中,mask数组的初始化都是0,uint(sig&31)是整数截取后5位,左移一位是因为信号量是从1开始的。因此运算完之后,前31个信号量存放在mask数组的第一个元素中,这个4字节的元素可以表示成32位的二进制,0000,0000,0000,0000,0000,0000,0000,0000,从后往前,编号从0到31,如果信号量是1,则编号为1的位置置1。就像是有32个桶,每个桶都有一个编号,从0到31,如果有这个信号量的值,就在桶里放满水。

want函数是判断给定的整数,是不是这个62个信号量。

clear 利用&^,将对应位置清零

go语言这种处理方式阅读起来还是挺巧妙的,之前看得时候也是弄明白,现在记下来,希望能提供一点用处。

总结

linux信号量的知识储备不全,先获取了linux信号量的知识之后才搞明白为什么这么写的。

源码这种事情,还是可以多带带拿出来,针对看不懂的地方进行调试,快速的了解。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33606.html

相关文章

  • 使用 DataAnt 监控 Apache APISIX的原理解析

    原理简介第一步 采集配置DataAnt Agent 进行对 config.yaml 的配置, 来进行APISIX 项采集器初始化和注册。DataAnt Cloud接收数据后,数据经过处理后会存放到数据库中第二步 告警通知数据经过告警匹配处理,会通知聚合最终通过配置的通知方式将告警发送,以实时接收到APISIX情况第三步 配置指南访问 DataAnt Cloud,注册后并登录平台下载DataAnt ...

    3119555200 评论0 收藏0
  • Derek解读Bytom源码-启动与停止

    摘要:只有当触发了或才能终止进程退出。退出时执行如下操作会将挖矿功能停止,网络停止等操作。 作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍bytom代码启动、节点初始化、及停止的过程 作者使用MacOS操作系统,其他平台也大同小异Golang V...

    Godtoy 评论0 收藏0
  • 使用python爬虫实现子域名探测问题

      大家都知道,在python当中,需要面对是各种各样的问题,比如我们需要用到的是:使用python爬虫实现子域名探测,这种技能是值得我们去进行学习的,但是学习的话,内容还是比较多的,下面就具体的内容,给大家做出一个详细解答。  前言  意义:子域名枚举是为一个或多个域查找子域的过程,它是信息收集阶段的重要组成部分。  实现方法:使用爬虫与字典爆破。  一、爬虫  1.ip138  defsear...

    89542767 评论0 收藏0
  • Golang源码分析可视化

    我们在阅读博客和文档的时候,通常倾向于阅读配有图形的这些文章。如果一篇技术类文章从头到尾都是文字,将十分影响读者的阅读体验, 也不便于读者理解。还有我们在进行一些项目源码分析时,边阅读代码,边绘制一些图形能够极大的提升效率,同时也能加强自己理解。 这片博文我将介绍我是如何绘制调用图和'类图'(不是面向对象语言中的类图)帮助自己更好地理解Golang项目的。Golang目前还没有关于...

    社区管理员 评论0 收藏0
  • GO111MODEDULE变量以及Go Module的使用建议

    我们可能在很多地方如 README 文件、Makefile 文件以及 Dockerfile 文件中看到GO111MODULE=on, 对于刚接触的Golang的开发者可能对此有很多疑惑。这片文章,我将详细介绍GO111MODULE变量的意义,以及什么时候需要使用到该变量, 同时也总结了一些在使用 Go Modules 时需要注意的细节,帮助你在下次遇到这个变量时不再疑惑。GO111MODULE=o...

    社区管理员 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<