Linux主控程序

来源:互联网 发布:手机人肉搜索软件 编辑:程序博客网 时间:2024/04/29 07:57

《ARM Linux开发-warewin 2G/3G无线传输(DTU)和路由器—笔记》

6.1Liunx程序的整体思路

init进程是Linux内核启动的第一个进程,它是后续所有进程的发起者。本系统的init进程为指向rc进程的链接,因此rc进程为主进程,是进入内核首先运行的程序,做初始,在主进程程序中再启动其它子进程。挂起等待进程信号。

子进程通过发信号通知主进程、主进程收到信号后做某些事物处理或启动或关闭其它子进程。此外有些进程之间是通过socket套接字进行通信。

对于有些进程是程序运行一次即退出,有些进程是程序一直循环运行。

6.1rc程序

主进序名为rcinitip-upip-downdtu-dnsstart_watchdogstart-lanstop-lanstart_timer等这些进程都是指向rc的连接,当运行这些进程时rc进程根据进程参数判断执行哪些处理程序,Linux主控程序流程图如下所示:

 

6.1 主程序流程图

如果运行的是init指示符,则进入RC主循环执行。

6.3、初始化运行环境

主循环包括以下几部分的初始化:

1、系统初始化

挂载系统相关目录

所有设备结点的生成

挂载flash分区相关目录

创建参数文件的链接

创建相关目录

设备参数初始化

控制台初始化

内核模块载入

时区设置、系统时间与硬件同步

内置硬件看门狗启动

外置硬件看门狗启动

2GPIO初始化 

打开关闭相关指示灯、打开模块电源、关闭子板电源

关闭不用的GPIO

打开子板电源

各模块初始化

3、局域网开启

4、信号初始化 

信号初始化

注册信号 

5、配置文件初始化

PPP拔号相关配置文件

DTU参数配置文件

网控器参数配置文件

电话或短信触发配置文件

ICMP检测配置文件

DNS检测配置文件 

DDNS参数配置文件

维护通道参数配置文件

6.4、运行各种进程

1、开启TCP本地server

开启流程如下图所示:

 

6.2 本地server进程流程图

2、开启各种服务

Httpd服务器开启

DTU客户端连接开启

Dhcpd服务开启

Telnet服务开启

监视重复进程数量服务开启

流量统计开启

6.5、确保PPPD进程正确运行

1、运行pppd之前先判断模块接口是否可以正常打开,如果打开异常则重启系统。

2、运行pppd后每隔1秒判断是否生成/tmp/ppp/link.文件,在超时时间内没生成则重新拨号。

3、重新运行pppd前要对模块做复位处理,断开pppd连接避免上次运行的pppd没退出。

4pppd拨号成功开启网络测试功能,避免pppd自身检测不到掉线。

6.6、运行至循环处理

主程序初始化完毕,相关服务开启后开始进入主循环处理,主循环中开始拨号上线及上线后的各种处理,最后空闲挂起等待事件信号。主循环主要是监控PPPDWAN是否有异常,发现异常则做相应的处理,处理流程如下图所示:

 

6.3 主进程主循环流程图

如上面的流程图可以看出,主循环是一个状态机。当有进程发来信号时,信号处理函数改变状态的值,主循环跳出IDLE状态,到RESTART,或STOP状态,再次循环执行,最后稳定到空闲状态。常见的是当PPPD下线运行ip-down进程,该进程发信号给主进程,主进程到RESTART状态。主程序重新运行拨号处理。

6.7信号的使用

信号是UNIXLinux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。

需要包含的头文件:#include <signal.h>

信号的使用包括以下步骤:

1注册一个信号。

例如:signal(SIGHUP, rc_signal);

2信号处理函数。

static void rc_signal(int sig)

.....................

if (sig == SIGHUP) {

syslog(6,"signalling RESTART\n"); 

signalled = RESTART;

}

..................

3发送信号

给主进程发信号:kill(1, SIGHUP);

0 0
原创粉丝点击