网站开发公司+重庆,设计一个网站的价格,一般哪些商家需要建设网站,临沂seo网站管理文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程… 文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程的状态是什么2、进程的状态 7.Linux下的进程状态1、运行状态 - R2、阻塞状态 - S (可中断)3、阻塞状态 - D (不可中断)4、僵尸状态- Z 和 死亡状态 - X5.停止状态 - T / t 8.孤儿进程9.进程优先级1、什么是优先级 vs 权限 是什么2、为何会存在优先级为什么3、Linux下的优先级的相关概念和操作怎么办 10.竞争性_独立性_并行_并发_进程间切换 三、环境变量1.环境变量操作2.让自己程序和命令一样执行3.常见环境命令4.环境变量的C、C获取方式代码如何获取环境变量1、mian函数参数获取环境变量2、通过C语言提供的全局变量获取 - environ3、获取环境变量函数 - getenv(const char* name) 一、硬件-冯诺依曼体系结构
我们常见的计算机如笔记本。我们不常见的计算机如服务器大部分都遵守冯诺依曼体系。 输入键盘话筒摄像机磁盘网卡… 输出显卡音响磁盘网卡显卡… (运算器控制器)[cpu]算术计算逻辑计算 储存器就是内存
为什么要有内存直接将输入设备和cpu直接连接不可以吗 a. 技术角度 cpu的运算速度寄存器的速度L1~L3Cache内存外设磁盘光盘磁带 数据角度外设不和CPU直接交互而是和内存交互CPU也是如此。 内存在我们看来就是体系结构的一个大的缓存适配外设和CPU速度不均的问题的 b. 成本角度 造价成本寄存器内存磁盘(外设)
几乎所有的硬件只能被动的完成某种可能不能主动的完成某种功能一般都是配合软件完成的OSCPU
二、软件-操作系统-进程概念
0.操作系统做什么的
操作系统是一款软件搞管理的软件什么叫做管理, 如何理解 管理的本质不是对被管理对象进行直接管理而是只要拿到被管理对象的所有的相关数据我们对数据的管理就可以体现对人的管理————对数据做管理
数据是有多少的区分的如何管理好大量数据 大量数据就需要结构化也就是对数据结构的管理。
管理的核心理念先描述再组织 1.什么叫做进程
进程是一个运行起来的程序
操作系统里面可能同时存在大量的进程操作系统需要对进程管理对进程管理本质就是对进程数据的管理就需要先描述再组织。
struct task_struct : 就是描述进程的像这样描述进程的统称为进程控制块PCB( proccess ctrl block )而task_struct就是其中一个具体实例。
进程 可执行程序 该进程对应的内核数据结构PCB
OS为什么给我们提供服务 printf 向显示器打印本质就是将数据写到硬件上我们的c程序没有资格向硬件写入计算机和os设计出来是为了给人提供服务的。
如何提供服务 操作系统不相信如何人不会直接暴露自己的任何数据结构代码逻辑其他数据相关的细节操作系统是通过系统调用的方式对外提供接口服务的Linux操作系统是用c语言写的这里所谓的“接口”本质就是c函数我们学习系统编程—本质就是在学习这里的系统接口
2.查看进程
先写一个死循环程序编译运行
#includestdio.h
int main()
{while(1){printf(I am a process!\n);}return 0;
}
查看进程方式1 这是查看进程的第一种方式也是最常用的。
ps ajx 进程名 | grep 进程名有头部提示
ps ajx |head -1 grep 进程名称为什么会有两个 我们自己写的代码编译称为可执行程序启动之后就是一个进程 别人写的启动之后也是一个进程比如ls pwd touch grep … 那么这些程序在系统中的位置— /usr/bin 第二个进程就是查询程序的进程第一个就是我们编写的程序的进程。 根目录里有一个目录proc,放内存文件系统系统里放着当前系统实时的进程信息。查看目录里面的内容
上面的蓝色就是进程的pid 每一个进程在系统中都会存在一个唯一的标识符pid-process id就如每人都有一个身份证号。
查看运行进程目录其中有一个cwd cwd current work directory 进程当前工作路径
当前路径 当前进程所在路径进程自己会维护
查看进程的方式2 先查进程pid在再/proc里的进程目录查看详细信息。
那么上面所说的pid,当前路径等待是进程的内部属性程序运行放在哪里 进程的进程控制块-PCB(task_struct)结构体中
3.系统接口 获取进程pid- getpid
命令行查看系统接口getpid:
man 2 getpid#includestdio.h
#includesys/types.h
#includeunistd.h
int main()
{printf(我的pid是 %d\n,getpid());return 0;
} 杀进程除了Ctrlc还有一个方法 另起一个页面命令行输入kill -9 进程的pid
4.系统接口 获取父进程pid - getppid
命令行查看系统接口getppid:
man 2 getppid注 手册退出按q
#includestdio.h
#includesys/types.h
#includeunistd.h
int main()
{printf(我的pid是 %d,ppid: %d\n,getpid(),getppid());return 0;
}
多次运行发现ppid不变 查看进程发现父进程是一个bash:
为什么父进程不变它是谁 几乎我们在命令行上执行的所有的指令你的cmd,都是bash进程的子进程
5.系统接口 创建子进程 - fork
1、手册
man 2 fork2、返回值
下面为手册中返回值解释 fork函数是用来创建子进程的它有两个返回值
#includestdio.h
#includesys/types.h
#includeunistd.h
int main()
{pid_t id fork();printf(hello world,id: %d\n,id);return 0;
} 父进程返回子进程pid子进程返回0
同一个id值使用打印没有修改却打出来了不同的值 现在无法解释进程地址空间才能解释 c语言上if和else 可以同时执行吗 c语言中有没有可能两个以上的死循环同时运行 #includestdio.h
#includesys/types.h
#includeunistd.h
int main()
{pid_t id fork();if(id0){while(1){printf(我是子进程我的pid:%d,我的父进程是%d\n,getpid(),getppid());sleep(1);}}else {while(1){printf(我是父进程我的pid:%d,我的父进程是%d\n,getpid(),getppid());sleep(1);}}printf(hello world,id: %d\n,id);return 0;
} 为什么 fork 给父进程子进程的pid,给子进程 0 父亲儿子 1n (n1) 为什么给父进程子进程的pid 父进程必须有标识子进程的方案fork之后给父进程返回子进程的pid 为什么给子进程0 子进程最重要的是要知道自己被创建成功了因为子进程找父进程成本非常低getppid() 综上得出结论 fork之后父进程和子进程会共享代码一般都会执行后续代码 — printf为什么会打印两次的问题 fork之后父进程和子进程返回值不同可以通过不同的返回值来判断让父子执行不同的代码块
3、fork做了什么
fork之后OS做了什么 系统多了一个进程 父进程task_struct 进程代码和数据 子进程task_struct 子进程的代码和数据
子进程的tastk_struct对象内部数据从哪里来 基本是从父进程继承下来的
子进程执行代码计算数据子进程的代码从哪里来 和父进程执行同样的代码fork之后父子进程代码共享而数据要各自独立根据不同的返回值让不同的进程执行不同的代码可以用if else 来分流。
4、基本用法
#includestdio.h
#includesys/types.h
#includeunistd.h
int main()
{pid_t id fork();if(id0){//子进程执行的代码}else {//父进程执行的代码}return 0;
}
6.进程的状态
1、进程的状态是什么
其实就是个整数 int status在进程的task_struct进程控制块里。 int status: #define RUN 1 #define STOP 2 #define SLEEP 3
2、进程的状态
运行态进程只要是在运行队列中就叫做运行态代表我已经准备好了随时可以调度 注runqueue就是运行队里 终止状态进程还在只不过永远不运行了随时等待被释放
进程都终止了,为什么不立马释放对应的资源而是维护一个终止态 释放要花时间如果当前系统很忙系统就没有办法立刻释放就需要维护一个终止队列告诉系统我已经运行结束了随时可以释放对应的资源等到系统有空闲的时来释放我吧 进程阻塞进程等待某种资源非CPU资源没有就绪的时候进程需要在该资源的等待队列中进行排队此时进程的代码并没有运行进程所处的状态就叫做阻塞
1.一个进程使用资源的时候可不仅仅是申请CPU资源 2.进程可能申请更多的其他资源磁盘网卡显卡显示器资源声卡/音响
如果申请CPU资源暂时无法得到满足需要排队的–运行队列 那么如果申请其他慢设备的资源—也是需要排队的 当访问某些资源磁盘网卡该资源如果没有准备好或者正在给其他进程提供服务此时 1.当前进程从runqueue中移除 2.将当前进程放入对应设备的描述结构体中的等待队列
进程等待外部资源的时候该进程的代码不会被执行也就是我的进程卡住了就是进程阻塞 进程挂起短期内不会被调度你等的资源短期内不会就绪进程OS就会把该进程的代码和数据置换到磁盘上 如果内存不足怎么办 操作系统就会帮我们进行辗转腾挪短期内不会被调度你等的资源短期内不会就绪进程它的代码和数据依旧在内存中就是白白浪费空间OS就会把该进程的代码和数据置换到磁盘上
往往内存不足的时候伴随
7.Linux下的进程状态
Linux内核源码
/*
* The task state array is a strange bitmap of
* reasons to sleep. Thus running is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] {
R (running), /* 0 */
S (sleeping), /* 1 */
D (disk sleep), /* 2 */
T (stopped), /* 4 */
t (tracing stop), /* 8 */
X (dead), /* 16 */
Z (zombie), /* 32 */
};1、运行状态 - R
#includestdio.h
#includeunistd.hint main()
{while(1){printf(hello wordl!\n);sleep(1);}return 0;
}
运行并查看进程 虽然进程一直在执行但大部分都在sleep.
#includestdio.h
#includeunistd.hint main()
{while(1){printf(hello wordl!\n);// sleep(1);}return 0;
}
运行并查看进程 原因是这一句 printf(“hello wordl!\n”);进程大部分时间在等显示器就绪就绪就打印。
2、阻塞状态 - S (可中断)
“S (sleeping)” 阻塞状态 一般把S状态叫做浅度睡眠可中断睡眠 #includestdio.h
#includeunistd.hint main()
{while(1){}return 0;
}
运行并查看进程 这个进程没有访问外设在访问cpu资源大概率就是R状态。
“R (running)” 运行态
3、阻塞状态 - D (不可中断)
D (disk sleep) 阻塞态
D : 深度睡眠不可被中断睡眠
一般而言Liunx中如果我们等待的是磁盘资源进程阻塞所处的状态就是D。此时进程在等待外设切程序不可被中断如果可以中断磁盘写入失败磁盘会把写入失败结果告诉进程时发现进程已经没了就会造成数据
4、僵尸状态- Z 和 死亡状态 - X
X:死亡状态 Z(zombie):僵尸状态
当一个Linux中的进程退出的时候一般不会进入X状态死亡资源可以立马回收而是进入Z状态。
进程为什么被创建出来 一定是因为要有任务让这个进程执行当该进程退出的时候我们怎么知道这个进程把任务给我们完成的如何了呢一般需要将进程的执行结构告诉给父进程 OS
进程进入Z状态就是为了维护退出信息可以让父进程或者OS读取的通过进程等待来进行读取的
如何模拟僵尸状态 如果创建子进程子进程退出了父进程不退出也不等待子进程子进程退出之后所处的状态就是Z。
#includestdio.h
#includeunistd.h
#includestdlib.h
int main()
{pid_t id fork();if(id0){//childint cnt 5;while(cnt){printf(我是子进程我还剩下%d s\n,cnt--);sleep(1);}exit(0);}else{//fatherwhile(1){sleep(1);}}return 0;
}
编译运行并查看进程
while :; do ps axj|head -1ps axj|grep test|grep -v grep;sleep 1; don长时间僵尸,有什么问题 如果没有人回收子进程的僵尸该状态会一直维护该进程的相关资源task_struct不会被释放内存泄漏一般必须要求父进程进行回收后面说。
5.停止状态 - T / t
将进程暂停 方法一 运行程序按Ctrlz。 方法二
发送暂停信号给进程
kill -19 pidt状态用gdb调试进程就会出现t状态。
8.孤儿进程
#includestdio.h
#includeunistd.h
#includestdlib.h
int main()
{pid_t id fork();if(id0){//childint cnt 5;while(cnt){printf(我是子进程我还剩下%d s\n,cnt--);sleep(1);}exit(0);}else{//fatherwhile(1){int cnt 3;while(cnt){printf(我是父进程我还剩下%d s\n,cnt--);sleep(1);}exit(0);}}return 0;
}上面现象 前三秒父进程还没退出当父进程退出后子进程的父进程变成了1号进程再过两秒子进程退出被1号进程回收。
结论 如果父进程提前退出子进程还在运行子进程会被1号进程(操作系统)领养像这样被领养的进程就叫做孤儿进程。
子进程状态从S变成S表示什么 带号的表示前台进程可以使用Ctrlc来杀掉前台进程。 但后台进程就无法用Ctrlc来杀掉只能用发送信号来杀掉进程
kill -9 后台进程的pid9.进程优先级
1、什么是优先级 vs 权限 是什么
优先级是进程获取资源的先后顺序。 权限是能还是不能的问题。
2、为何会存在优先级为什么
排队的本质叫做确定优先级那为什么要排队------资源不够 系统里面永远都是进程占大多数而资源是少数进程竞争资源是常态有竞争就需要确认先后所以要存在优先级。
3、Linux下的优先级的相关概念和操作怎么办
查看进程
ps -al优先级由两部分构成 PRI:priority NI :nice 进程优先级的修改数据 默认进程优先级是80,数字越小优先级越高 要更改进程优先级需要更改不是pri,而是Ni。
更改优先级 命令行输入top-r-输入要更改进程的pid-回车-输入nice的值范围-20~19一共40个级别-回车。 naic的取值范围[-20,19] priority的取值范围[60,99]
10.竞争性_独立性_并行_并发_进程间切换
竞争性: 系统进程数目众多而CPU资源只有少量甚至1个所以进程之间是具有竞争属性的。为了高效完成任务更合理竞争相关资源便具有了优先级
独立性: 多进程运行需要独享各种资源多进程运行期间互不干扰不会因为一个进程挂掉或者异常而导致其他进程出现问题
并行: 多个进程在多个CPU下分别同时进行运行这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式在一段时间之内让多个进程都得以推进称之为并发
多个进程都在你的系统中运行 多个进程都在你的系统中同时运行 不要以为进程一旦占用CPU,就会一直执行到结束才会释放CPU资源我们遇到的大部分操作系统都是分时的操作系统会给每一个进程再一次调度周期中赋予一个时间片的概念在一个是时间段多个进程都会通过切换交叉的方式让多个进程代码在一段时间内都得到推进这个现象我们叫做并发。 操作系统就是简单的根据队列来进行先后调度的吗如何突然来一个优先级更高的进程 抢占式内核正在运行的低优先级进程如果来个优先级更高的进程我们的调度会直接把进程从CPU上剥离放上优先级更高的进程进程抢占。 进程间切换
CPU的寄存器是可以临时的存储数据非常少但非常重要。 当进程再被执行的过程中一定会存在大量是临时数据会暂时存在CPU内的寄存器中。 我们把进程在运行中产生的各种寄存器数据叫做进程的上下文数据。 当进程被剥离需要保存上下文数据 当进程恢复的时候需要将曾经保存的上下文数据恢复到寄存器中
上下文在哪里保存 task_struct
三、环境变量
为什么代码运行要带路径而系统的指令不用带路径 执行一个可执行程序前提是要先找到它 系统中是存在相关的环境变量PATH保存了程序的搜索路径的
1.环境变量操作
查看所有环境变量:
env显示某一个环境变量 echo $变量名
echo $PATH命令行定义本地变量
a100查看本地变量 set 变量本地变量和环境变量都可以查到
set a注本地变量不能被env查到
导出环境变量
export bbbb223可以被env查到
env |grep bbbb取消环境变量
unset 环境变量总结 查看环境变量 env 查看变量(可以是环境变量也可以是环境变量)set 查看某一个环境命令eche $环境变量 导出环境变量export 环境变量 取消环境变量unset 环境变量
命令行变量分两种 1.普通变量 2.环境变量全局
2.让自己程序和命令一样执行
如何让自己的程序不用带路径 系统会在环境变量PATH你找可执行程序如果存在就会执行例如cd,lstouch…也就是说我们将程序的路径导入PATH里就可以像系统命令一样执行。
先查找当前程序路径在导入路径到PATH:
pwd
export PATH$PATH:路径是路径的分隔符。 注这只是暂时的重新远程登陆环境变量就会被重置导致失效。如果想永久实现这个效果需要修改配置文件但不建议会污染命令池。
3.常见环境命令
PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) SHELL : 当前Shell,它的值通常是/bin/bash。
4.环境变量的C、C获取方式代码如何获取环境变量
1、mian函数参数获取环境变量
main函数可以带参数吗最多可以带多少
#includestdio.h
int main(int argc,char* argv[])
{int i 0;for(i0;iargc;i){printf(argv[%d]:%s\n,i,argv[i]);}return 0;
} 我们给main函数传递的agrcchar* argv[]命令行参数传递的是命令行中输入的程序名和选项那么意义是什么
同一个程序通过传递不同的参数让同一个程序有不同的执行逻辑执行结果。Linux系统中会根据不同的选项让不同的命令可以有不同的表现指令中那么多选项的由来和起作用的方式。下面有小实例演示
想实现命令行计数器 ./myproc -a 10 20 102030 ./myproc -s 10 20 10-20-10
#includestdio.h
#includestring.h
#includestdlib.h
void usage()
{printf(输入有误,命令使用规则\n);printf(加法./myproc -a 参数1 参数2\n);printf(减法./myproc -s 参数1 参数2\n);
}
int main(int argc,char* argv[])
{if(argc!4){usage();}else {if(strcmp(argv[1],-a)0){int a atoi(argv[2]);int b atoi(argv[3]);printf(%d%d%d\n,a,b,ab);}else if(strcmp(argv[1],-s)0){int a atoi(argv[2]);int b atoi(argv[3]);printf(%d-%d%d\n,a,b,a-b);}else {usage();}}return 0;
} 回到第一问main函数可以带几个参数 可以带三个一个进程是会被传入环境变量参数的
#includestdio.h
int main(int agrc,char* argv[],char*env[])
{ for(int i 0;env[i];i){printf(env[%d]:%s\n,i,env[i]);}return 0;
} 扩展 一个函数在声明是时候没有带参数可以给这个函数传参吗 可以。只有fun(void)传参数才会报错。下面演示
#includestdio.h
void fun()
{prinf(hello world!\n);
}
int main()
{fun(10,29.3,20);return 0;
}2、通过C语言提供的全局变量获取 - environ
#includestdio.h
int main()
{extern char** environ;for(int i 0;environ[i];i){printf(%d:%s\n,i,environ[i]);}return 0;
} 3、获取环境变量函数 - getenv(const char* name)
查看接口
#includestdio.h
#includestdlib.h
int main()
{const char* s getenv(PATH);printf(%s\n,s);return 0;
} 为什么要获取环境变量
一定有特殊用途比如说程序可以通过获取环境变量获取用户信息来确定是否有权限执行。 环境变量是谁给的
1.命令行启动程序父进程都是bash 2.环境变量是会被子进程继承下去的 3.环境变量是全局变量。 所谓的本地变量本质就是在bash内部定义的变量不会被子进程继承下去
Linux下大部分命令都是通过子进程的方式执行的 但是还有一部分命令不通过子进程的方式执行而是由bash自己执行调用自己的对应的函数来完成特定的功能我们把这种命令叫做内建命令。 文章转载自: http://www.morning.chrbp.cn.gov.cn.chrbp.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.ndmh.cn.gov.cn.ndmh.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.dmfdl.cn.gov.cn.dmfdl.cn http://www.morning.spftz.cn.gov.cn.spftz.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.ghxtk.cn.gov.cn.ghxtk.cn http://www.morning.cffwm.cn.gov.cn.cffwm.cn http://www.morning.sxtdh.com.gov.cn.sxtdh.com http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.kynf.cn.gov.cn.kynf.cn http://www.morning.kqcqr.cn.gov.cn.kqcqr.cn http://www.morning.pxdgy.cn.gov.cn.pxdgy.cn http://www.morning.znpyw.cn.gov.cn.znpyw.cn http://www.morning.srhqm.cn.gov.cn.srhqm.cn http://www.morning.nnhfz.cn.gov.cn.nnhfz.cn http://www.morning.rbhqz.cn.gov.cn.rbhqz.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.kkgbs.cn.gov.cn.kkgbs.cn http://www.morning.qqrlz.cn.gov.cn.qqrlz.cn http://www.morning.rntyn.cn.gov.cn.rntyn.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.sgmis.com.gov.cn.sgmis.com http://www.morning.mm27.cn.gov.cn.mm27.cn http://www.morning.mdrnn.cn.gov.cn.mdrnn.cn http://www.morning.fssmx.com.gov.cn.fssmx.com http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.qqpg.cn.gov.cn.qqpg.cn http://www.morning.ktrzt.cn.gov.cn.ktrzt.cn http://www.morning.rdfq.cn.gov.cn.rdfq.cn http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn http://www.morning.mwwnz.cn.gov.cn.mwwnz.cn http://www.morning.tddrh.cn.gov.cn.tddrh.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.cjcry.cn.gov.cn.cjcry.cn http://www.morning.rydhq.cn.gov.cn.rydhq.cn http://www.morning.grnhb.cn.gov.cn.grnhb.cn http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.hphfy.cn.gov.cn.hphfy.cn http://www.morning.rswfj.cn.gov.cn.rswfj.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.glcgy.cn.gov.cn.glcgy.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.kkzwn.cn.gov.cn.kkzwn.cn http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn http://www.morning.hmktd.cn.gov.cn.hmktd.cn http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn http://www.morning.lwlnw.cn.gov.cn.lwlnw.cn http://www.morning.zlzpz.cn.gov.cn.zlzpz.cn http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.dnydy.cn.gov.cn.dnydy.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.zxqyd.cn.gov.cn.zxqyd.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.xtrnx.cn.gov.cn.xtrnx.cn http://www.morning.clgbb.cn.gov.cn.clgbb.cn http://www.morning.paxkhqq.cn.gov.cn.paxkhqq.cn http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn http://www.morning.wqkzf.cn.gov.cn.wqkzf.cn http://www.morning.kwqt.cn.gov.cn.kwqt.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.bnpn.cn.gov.cn.bnpn.cn http://www.morning.mnyzz.cn.gov.cn.mnyzz.cn http://www.morning.gcysq.cn.gov.cn.gcysq.cn http://www.morning.qnhcx.cn.gov.cn.qnhcx.cn http://www.morning.xnpj.cn.gov.cn.xnpj.cn http://www.morning.kjyhh.cn.gov.cn.kjyhh.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn