OpenvSwitch系列之浅析main函数

通过前面几篇解析OpenvSwitch内部主要数据结构和流程,对OpenvSwitch有了相对简单的了解,由于本人不是专业搞OpenvSwitch的,纯属业余爱好,今天可能是OpenvSwitch最后一篇了,我们要做到有始有终嘛,所以我们来分析一下main函数。然而main函数里面涉及内容比较多,而且比较深入,所以这篇文章只是浅析,不能算深入剖析,希望以后能有哪位大神能够做一个深入剖析。

自己在学习开源软件总是喜欢看一下main函数,认为不把main函数搞明白了,就不算一个好程序员!!其实把main函数搞明白了,所有东西都会被串起来了,软件架构也就清晰啦。

我们先看一下openvswitch默认启动时候的参数:
--mlockall
--no-chdir
--log-file=/var/log/openvswitch/ovs-vswitchd.log
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid
--detach –monitor
由此可知,上面是openvswitch会启动两个进程,一个进程是管理进程(2154),一个是业务处理进程(2155)。

我们开始进入正题吧,main函数虽然不是很长,但是最复杂的函数,里面涉及很多与操作系统相关的功能和函数,比如,守护进程,信号,dpdk,pipe等。如果熟悉linux环境编程,看main函数可能比较轻松一点。我们采用分段介绍:

以上代码主要完成:
1、dpdk初始化(如果系统支持),命令行参数解析,信号设置等,以便于openvswitch能够正常启动。参数解析比较枯燥,我们完全可以通过gdb调试跟踪,这样也比较方便理解。对于参数解析函数,我也没有深入研究,有兴趣网友可以分析一下。
2、daemonize_start启动守护进程。这个函数我深入研究了一下,这里我会深入展开的。

我们在这里就展开daemonize_start函数 :
我们假定进入函数daemonize_start的进程是进程A(PID=1005)

我们来看一下,这个fork函数,比较欣慰的是这个函数有英文注释,而且英文注释说的也非常清楚,下面也有我自己添加的注释。

通过上面的分析可知,某个时刻,会有三个进程同事存在,为了验证准确性,我进行了gdb调试,调试截图如下:

再启动另外一个终端查看,ovs-vswitchd进程是否为三个,如下图所示:

通过查看,果然是存在三个进程。那么问题来了,当启动完成后,只有两个进程,那么什么时候进程A才会退出呢?

我们现在回到main函数中,通过阅读代码,我现在是这下面这个函数中,进程C会通知进程B完成初始化,然后进程B在通知进程A,最终进程A退出。下面代码主要是main函数中死循环,具体函数说明如下:

我们总结一下

1、任何程序都是可以调试,当我们通过看代码无法分析出层次关系,往往调试工具、日志是我们最好的伙伴。比如说,我当初不知道进程A是如何在什么情况下退出的,这个时候我就通过gdb调试,一步一步断点跟踪。

2、对于main函数还是有很多需要仔细推敲的,这里个人水平有限,加上工作中又有很多事情无法进一步分析。这里有几个疑惑地方,在这里向大家说明一下,如果有哪位大神知道,请一定要指点迷津。

疑惑1:函数unixctl_server_create会创建一个socket文件,这个socket文件默认是"punix:/usr/local/var/run/openvswitch/ovs-vswitchd.12861.ctl",用于通过和其他进程(主要是openvswitch相关工具),具体是哪些工具呢??

疑惑2:在main函数中,注册了一个命令行exit,使得openvswitchd能够安全退出,不知道这个命令行怎么用??

以上就是我分析openvswitchd源代码全部内容,有些地方分析不是很透彻,有些地方分析的也比较混乱。通过我这最近两月学习,有一些心得体会拿出来和大家分享一下:

1、个人觉得openvswitchd中代码含金量还是很高的,无论是从个人还是公司角度,都是值得我们学习与阅读。强烈建议有相关需求的人去阅读一下。

2、如果想深入学习openvswitchd,需要特别关注一下这几个方面,用户态和内核态程序间通信(Netlink),dpdk,netdev等。如果熟悉内核的人,对这些内容可能不是很陌生,然而很多人都不是搞内核的,所以这些内容需要我们个个突破。

3、我前面几篇都是分析用户态程序(ovs-vswitchd),内核态程序没有分析,其实内核态程序占得比重也非常大。

4、我建议在看我源码分析文章时,最好能够自己先看一下源代码,这样能够跟上我文章的思路,不然有的文章看着会很枯燥。

这里感谢大家支持,感谢sdnlab支持,希望大家在SDN道路上越走越光明!!

作者简介:
徐小冰:毕业于河北大学,主要从事嵌入式软件开发,虚拟化,SDN。目前基于ODL和Open vSwitch进行二次开发,希望与广大网友一起探讨学习。作者系OpenDaylihgt群(194240432)资深活跃用户,@IT难人。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/15792.html
分享到:
相关文章
条评论

登录后才可以评论

xxb249 发表于16-02-16
3