信号机编程
㈠ Linux fd 系列|信号编程(signal)竟能这样做涨姿势
来源 | 奇点云存储(id : qiyacloud)授权转载
如若转载请联系原公众号
信号是什么?
首先说,信号(signal)是什么?
信号( signal )本质是 Linux 进程间通信的一种机制,也叫 软中断信号 。既然是通信机制,那么就是传递信息用的,信号传递的信息很简单,就是一个整数,一般用于配合系统管理任务,比如进程的终结、恢复、热加载等。
信号都用整数常量表示,命名以 SIG 为前缀,比如 SIGINT( ctrl-c 触发),SIGKILL( kill -9 触发 )。
信号一般怎么产生?
信号处理分为两个阶段 :
signalfd 是什么?
了解了什么是信号( signal ),那 signalfd 又会是什么呢?
是一个跟信号关联的 文件描述符 ,能够以 io 的行为获取到系统信号,属性上来讲 signalfd 也是一个匿名 fd 类型。
signalfd 长什么样子?
奇点按照 man signalfd 里面的例子,写了个 demo,跑在 Linux 机器上,按照惯例去看下 fd 的样子。
从这里可以得到简单的信息:
signalfd 使用姿势?
其实信号是很讲究的,甚至有信号编程一说,Linux 的 signalfd 为信号的处理提供了一种新的方法, 统一到文件的 io 模式,契合一切接文件的理念 。
系统调用:
该系统调用返回一个整数类型 signalfd,这个句柄跟信号行为绑定,当发生信号的时候,句柄触发可读事件。
第一个参数也可以传入一个有效的信号 fd 的句柄, 如果传入的是 -1 ,那么内核会自动创建一个新的 fd 。
完整的代码例子,在 Linux 机器上,通过 man signalfd 就可以获取到。
上面的例子,signalfd 没有信号(没有可读事件)的时候会阻塞在 read 调用上,运行效果如下:
可以看到每一次 ctrl + c 触发的信号被捕捉到,并且打印出来。用文件 io 的方式来接收信号,牛。
怎么做到的呢?照例,我们浅析一下内核的代码,位于 fs/signalfd.c ,这是一个很小的文件,正是这个文件完成了对信号“文件化”的封装。
上面最重要的两个调用:
signalfd 原理剖析
1 signalfd
看一下 signalfd 支持的接口调用:
通过这个可以知道 signalfd 支持的特性:
2 signalfd_poll
这个函数做的事情非常简单,就是把 等待对象 挂到当前进程的信号结构的链表上。表头是: current->sighand->signalfd_wqh ,这个就有意思了,这里直接挂到当前进程的结构上。换句话说,唤醒也是自此表头开始。
回忆一下 timerfd ,是挂在 timerfd_ctx->wqh 的字段上。这里的差别是因为信号是对进程来说的。
3 signalfd_read
读一个 signalfd 的操作非常简单,主要逻辑:
简要的代码注释如下:
这里就能非常清晰的看到, 进程有信号的时候,signalfd 句柄就是可读的 。
signal 和 epoll 的配合
1 熟悉的 epoll_ctl
epoll_ctl 注册 signalfd 的时候,调用 signalfd_poll , signalfd_poll 会把 epoll 创建的 wait entry 挂到 current->sighand 上。唤醒的时候调用这个 wait 链表的回调。
2 什么时候唤醒呢?
唤醒的操作其实不在 signalfd.c 文件中,而是在原有的信号软中断的流程中。
为了知识的完整性,说个点, signalfd_notify 其实在 timer 定时器的流程中也有调用,但跟我们本次主干没啥关系,这里忽略。
信号的发送唤醒的简要示意图:
所有的信号发送都会调用到 send_signal ,在这个里面实现了唤醒 sighand->signalfd_wqh 链表的操作。从而使得 epoll 感知到 signalfd 可读了(因为来信号了),使得 epoll 从 epoll_wait 出唤醒,然后调用 read 操作,把信号的相关信息从句柄中读出来。
划重点:唤醒在 信号发送 的过程。
总结
㈡ 交通信号灯的原理是什么交通怎么不会乱呢红绿黄三色变换时间有规定吗
LED交通信号灯是在规定时间规范不同方向车辆行驶,变换时间是按实地考察根据不同路段车辆流通状况来变换,规定红绿灯亮的时间长度。这个时间是通过信号机控制
㈢ 软件工程师工作总结
引导语:工作总结是做好各项工作的重要环节.通过它,可以全面地,系统地了解以往的工作情况,以下是我搜集整理的软件工程师工作总结,欢迎大家阅读!
软件工程师工作总结篇一
光阴似箭,岁月如梭,辉煌的20xx已经过去,充满希望的20xx已在不知不觉中走到了12月份,现将20xx年下半年工作总结如下:
一、项目方面:
主要是围绕信号机开发的各种软件,如信号机底层软件、信号机设置软件、以及为了保障信号安全的防火墙软件等,另外还围绕交通诱导屏这个产品做了相关的工作,如诱导屏设置软件,以及诱导屏测试软件等工作。
1、信号机软件开发
从去年的年底已经开始这项工作了,我的工作相对来说比较单一一点,就是信号机设置软件以及底层软件的通讯部分的程序代码,以及其他的部分功能。并且现在这款信号机能够兼容多家协议。
2、防火墙软件的开发
这是独立开发、并最终调试的一个软件,能够严格防止外来非法连接的软件。由于目前还没有我们自己的信号机中心软件,所以目前这个软件现在还没有派上用场,相信随着公司的发展,会逐渐用上这样的软件产品的。
3、交通诱导屏的相关工作
当然这里面的工作就相当砸碎一些,包括设置软件、测试软件以及处理在调试的过程中碰到的一些问题,以及测试一些硬件模块的好坏等。
二、团队合作
从上面主要的工作内容来看,不是我一个人所能完成的,正所谓一切事务离不开团队,个人无法称英雄。今年在余sir领导之下,团队建设有了很大的进步,每个项目开始之前,好好的交流、加强了解、对问题的共识、解决问题的方法能很好的统一起来。我个人也很好的溶入这个团队,共同做好一个项目。没有我们自己的信号机中心软件,所以目前这个软件现在还没有派上用场,相信随着公司的发展,会逐渐用上这样的软件产品的。
当然这里面的工作就相当砸碎一些,包括设置软件、测试软件以及处理在调试的过程中碰到的一些问题,以及测试一些硬件模块的好坏等。
三、工作态度
给我的最大的感触就是一定要好好的去聆听,每个人对待问题的看法,不管他的看法对还是不对,合理与否,或者考虑的'角度是否确切,都要好好地聆听,至少要等他说完,如果你主观的色彩,可能你都不愿意或者不屑听完他说的话,但是静下心来你或许也能发现他看问题的某些角度是你没有考虑过的,他想的某些方面也许确实是要注意到的。静心!聆听!把技术与大家共同分享,共同提高。
四、来年工作展望
在新的一年里我希望能够在交通行业里做出更多新的产品,能够更加深入的研究下去,比如:目前我们欠缺的信号机中心软件,交通诱导屏的中心软件,这个两个应该是20xx年的首要任务了,如果还有时间我希望可以做gis地理信息系统方面的内容。
软件工程师工作总结篇二
伴随着充实紧凑的工作生活,两个月的时间已经过去了。这一段时间里有工作上的收获,知识的丰富,经验的增长,同时也暴露出很多问题和不足。总结经验,吸取教训,本文将主要从几个方面来对工作进行总结:工作的主要内容;其中的失败和教训以及成功和经验;展望下一阶段的工作,确定自己的目标。以此作为惩前毖后的记录。
1. 工作的主要内容
在这两个月的工作中,我的总体任务是协助苏薇做好武警黄金部队矿业权管理系统的后期测试,编码,修改,文档编写的工作,分解开来之后,我主要做了三件事:1.编写矿业权系统的各类文档;2.矿业权系统的编码及bug勘误工作;3.矿业权系统的测试工作。下面依照时间来对我的工作进行介绍。
初踏入职场,进入专业的软件制造公司,对我,一个没有接触过标准软件制作过程的新人来说,起步就是一个很大的难题。若直接做开发,则业务不熟练,代码不规范,弊大于利;若仅做学习,则不能跟上项目的步伐,不能以最快的速度融入工作中去。
在我还在忐忑自己到底要做什么工作的时候,任务已经下达了,首先进行矿业权系统的测试工作。这样的好处在于能够在测试的过程中,了解项目的整体布局,了解项目中的业务逻辑,了解项目中尚未完成的工作并以此作为下个阶段的工作目标。至此,入职工作顺利起步。
在对矿业权系统进行测试之后,暴露了系统的诸多问题,测试过程中发现矿权系统没有进行输入限定,为了解决这个问题需要对整个系统的数据进行整理,我的下一个任务就是编写矿业权系统的数据需求文档。在编写该文档的过程中,对矿权系统进行了更深入的了解,为之后的bug勘误工作奠定了一定的基础。
完成了矿业权系统的数据需求文档的编写之后,新的任务是对整个矿权的输入数据进行输入限定,在任务开始之处是极为困难的,幸而得到了同事们的帮助才得以顺利完成任务。任务虽然完成,但是对输入限定实现方法的一知半解以及任务完成过程中的不仔细,为之后发生的问题也埋下了苦果。
在对矿业权系统添加输入限定完成之后,进入了解决程序小问题的阶段,对矿权系统进行细微的缝补工作。这段时间是学习多于工作的,不同的问题督促我要每天和网络亲密接触数百次,又要劳烦诸位在百忙中的同事抽出时间来给我帮忙。虽然辛苦一点,但收获却是满满。
完成了系统的修补之后,我们的程序送到了四惠进行第一轮测试,在测试的一周里,我主要是补充网络编程的基础知识。
第一轮测试结果出来之后,我们项目组开始了紧张的第一轮矿业权系统bug勘误工作。拿到bug列表之后,发现有一小半错误皆是因我而起,输入限定问题很多,我也主动承担了输入限定部分的bug勘误工作。
第一轮bug勘误工作完成后,进行了第一轮了回归测试,测试结果已然不尽人意,仍然存在大量的问题需要修改,而且很多问题还是因我而起,输入限定仍然存在大量问题,再一次进行修改之后,我们的程序送到了十五所进行所检。
在进行所检之余,我又接到了新的任务,完成矿权系统的概要设计以及详细设计文档的编写。这两份文档已于9月2号编写完毕。
现阶段我的任务是根据所检的bug列表,对矿权系统进行回归测试。
2. 工作中失败的教训以及成功的经验
对于失败的教训要吸取,成功的经验要进行总结。我对成功的定义是:在保证质量的前提下完成既定的计划或目标就是成功。其他的所有结果都是失败。
成功的经验:
1) 敢于接受任务并想尽一切办法完成
入职两个月最大的收获就是敢于接受任务并想尽办法完成,每一个任务对于初入职场的我都是一个挑战,如何保质保量完成任务是最基本的要求。这两月最大的成功在于没有一次任务是拖沓的,每次都尽最大努力完成了任务。
2) 勇于承担错误,正视自身的问题
在这两个月的工作中可谓是错误不断,从文档的错别字这种小问题到矿权系统bug修改不正确导致崩溃这种大错误,暴露出来了很多的问题,我秉承着有错即改,下不为例的思想,正视自己的错误并积极改正,因此这也算是一个成功。
失败的教训:
1) 重视每一个细节,不要忽视小问题
在最初进行矿业权系统数据需求文档的编写的过程中,对某些页面的数据在数据库中没有存储的情况没有加以重视,在后期进行数据限定的时候,还要重新修改数据需求文档,造成了不必要的时间浪费。从这个事情上得到教训就是不要放过任何一个小问题,这个小问题可能导致之后的大问题。
2) 进行重复工作也不能大意
在对矿权系统进行输入限定的方法熟悉之后,都是重复性的工作,给每个页面,每个字段进行输入控制语句的添加,在进行了数个页面之后,出现了有的页面没有添加完整,或者提示语句不正确的情况,在后续的bug勘误中出现了大量此类问题,浪费了大量的时间和精力修改。从这个事情上得到的教训就是工作不能大意,重复性的工作更要完成好。一般重复性的工作第一次做不好,后续检查修改是非常浪费时间的。
3) 考虑问题要严谨
在对矿权系统bug勘误的过程中,对输入限定条件的判断出了问题,我想当然的按照我的主观思路对数据进行了限定,而在回归测试的时候出了问题,这些都是考虑不严谨的后果。这个事情的教训就是考虑不严谨直接导致问题推倒重来,影响了工作效率,而且很容易埋下隐患。
4) 注重用户体验
在矿权系统bug勘误的过程中,修改最多的在于坐标系统的提示语句,因为坐标系统不仅要求数据必须填入,而且每一个数据都有严格的格式限定,因此每一个错误提示的弹出都要本着如何让用户知道哪里错了为原则进行设置。在最初的限定里面,语句粗糙,弹出语句不明确,造成了用户使用的不方便,还得重新进行改造。这个问题的教训是一定要从用户的角度出发考虑问题,注重用户体验从简单的提示语句做起。
3. 展望下一阶段的工作
下一阶段短期内我们的工作主要针对矿权系统的使用的数据库变更来对我们的系统进行修改。我的工作任务主要是学习Oracle数据库和SQL数据库的使用上的区别,做好从SQL数据库向Oracel数据库的迁移工作。
这两个月的工作生活是充实且富有乐趣的,结识了很多同事和朋友,公司的氛围是非常轻松愉快的。感谢两个月来李鹏经理的关心,感谢部门同事的悉心指导,感谢公司各位同事的热心帮助,希望能在接下来的工作中能惩前毖后,总结经验,吸取教训,做到个人与公司共荣辱同进退,共同实现中地的辉煌。