linux毕业设计(论文).doc_第1页
linux毕业设计(论文).doc_第2页
linux毕业设计(论文).doc_第3页
linux毕业设计(论文).doc_第4页
linux毕业设计(论文).doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要摘 要现在,Linux已经是应用比较广泛的操作系统之一,在其系统中有很多的服务。为了实现远程配置和管理Linux中的各种服务,操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。关键词:Linux;内核;进程 1AbstractABSTRACTNow, Linux has a broader application of one of the operating system, there are many services in their systems. In order to achieve a variety of services in the remote configuration and management of Linux operating system is a low-level support for dealing with hardware and a limited set of services provided for the user program software. A computer system is a hardware and software symbionts, they are interdependent and indivisible. Computer hardware containing computer engine of peripheral devices, processors, memory, hard drives and other electronic equipment. But there is no software to operate and control it, own work. The complete control software called the operating system in Linux terms is known as the kernel, also known as the core. Linux kernel module (or component) is divided into the following sections: memory management, CPU and process management, file systems, device management and drive, network communications, and system initialization (boot) system call.Key words: Linux;kernel;process. 目录目 录第1章前言11.1 课题背景11.2 国内外研究现状11.3 本课题研究的意义11.4本课题研究的方法2第2章Linux内核32.1 内核的开发和规范32.2linux内核主要子系统3第3章Linux系统调用63.1 Linux系统文件63.2如何从文件中读取数据63.3进程和线程的使用7第4章 Linux内核日志的管理94.1内核日志与接口104.2实现命令124.3用户空间应用程序13第5章 程序设计和流程图153.2 设计思路155.2服务程序155.3客户程序25第6章 系统测试39总结40参考文献41致谢42第1章 前言第1章 前言1.1 课题背景Linux是目前应用最广泛的操作系统之一,Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。 随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供 MMU 的处理器上运行。Linux 内核的 uClinux 移植提供了对非 MMU 的支持。1.2 国内外研究现状Linux是现在开源项目的代表,很多大的硬件厂商也在支持Linux的发展。而且Linux平台上的服务软件也是越来越多了。现在Linux已经进入到企业级应用,Webmin是一种基于B/S模式的远程管理Linux系统的软件工具。1.3 本课题研究的意义本课题是为了给系统管理员提供一种远程管理Linux中某些主要服务的工具软件,完成服务配置管理和查看一些重要的数据。核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。实际上,操作系统的内核版本指的是在Linux本人领导下的开发小组开发出的系统内核的版本号。自1994年3月14日发布了第一个正式版本Linux 1.0以来,每隔一段时间就有新的版本或其修订版公布。 Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。事实证明,GPL对于Linux的成功起到了极大的作用。它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。1.4本课题研究的方法本课题主要是对网络配置、GTK库、Linux系统调用和网络编程方面的研究。采用C/S模式,在客户端采用GTK函数实现用户界面的编写,在服务器端通过Linux的系统调用,来实现本地服务配置,然后再通过Sock编程来实现服务器和客户端的通信,传递配置内容和服务指令。第2章 Linux 内核第2章 Linux内核Linux是最受欢迎的自由电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。 技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。2.1 内核的开发和规范核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。实际上,操作系统的内核版本指的是在Linux本人领导下的开发小组开发出的系统内核的版本号。自1994年3月14日发布了第一个正式版本Linux 1.0以来,每隔一段时间就有新的版本或其修订版公布。 Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。事实证明,GPL对于Linux的成功起到了极大的作用。它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。2.2linux内核主要子系统2.2.1系统调用接口SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。2.2.2 进程管理进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface POSIX 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。 进程管理还包括处理活动进程之间共享CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1)调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。2.2.3内存管理内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬 VFS 在用户和文件系统之间提供了一个交换层管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。2.2.4虚拟文件系统虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。VFS 在用户和文件系统之间提供了一个交换层 在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。41第3章 Linux 系统调用第3章 Linux系统调用3.1 Linux系统文件在Linux中最主要的资源就是文件,很多设备都是以文件形式存在的,所以大多数输入/输出都要通过文件读写来实现。也就是说通过一个单一的接口就可以处理外围设备和程序之间的通信。Linux文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等。很多系统服务和应用服务的配置文件都是以普通文件的形式存在,这些文件很容易通过Linux的系统调用来配置和修改,也可以用文档文件的修改方式来修改。3.2如何从文件中读取数据Linux文件读取有两种方法:一种是通过C语言的标准库函数调用来完成;另一种是通过对Linux的系统调用来完成。文件读取分3步完成:第一步是打开要读取的文件;第二步是把文件读取到内存中去;第三步是关闭打开的文件。l 在Linux中打开一个文件可以通过系统调用open()函数来实现:int fd = open(char *name,int how);其中参数name是要打开的函数名字;how是打开的方式;返回值-1为错误,成功就返回一个文件描述符。l Linux系统读取文件内容通过系统调用read()函数来实现,函数原形:ssize_t numread = read(int fd,void *buff,size_t qty);第1个参数是打开的文件描述符,第2个参数是存储文件数据的内存地址,第3个参数是读取数据大小。如果读取成功返回值是读取的字节数,失败就返回-1。l 系统调用write()函数将内存中的数据写入到文件中去,函数原形:ssize_t resut = write(int fd,void *buff,zize_t amt);这个系统将调用buff的数据写到文件中。第1个参数是打开的文件描述符;第2个参数是要写入文件数据的内存地址;第3个参数是写入文件的大小。进程不需要再对文件进行读写操作时,就要关系文件打开的文件。close能关闭打开的文件,其函数原形:int result = close(int fd);这个系统调用会关闭进程和文件之间的连接。参数是打开的文件描述符号。关闭成功返回0,失败返回-1。3.3进程和线程的使用3.3.1 Linux进程Linux进程创建很特别。很多其他操作都提供了产生进程的机制,在新的进程空间中创建进程,读取可执行文件。但是Linux不同,它创建的子进程具有和父进程相同的数据、代码段。父进程和子进程间的区别就是进程的pid不同,其他的都一样:pid_t result = fork(void)该函数比较特殊,它返回两次函数值,一次返回值是向父进程返回子进程的PID。还有一次是返回0(子进程)。在使用fork()函数创建进程的时候经常父进程等待子进程结束。系统调用wait(&status)让父进程阻塞直到子进程结束:pid_t result = wait(&status);3.3.2 Linux线程进程为线程提供了运行环境,多个函数可以同时运行,但是他们都是运行在相同的进程中的。pthread_cearte()函数可以创建一个线程:int pthread_ceate(pthread_t *thread,pthread_attr_t *attr,void *(*func)(void*),void *arg);第4章 Linux内核日志的管理第4章 Linux内核日志的管理在linux中,syslogd是用户空间的一个守护进程,所有的需要记录日志的别的进程可以和这个守护进程通信,可以委托这个守护进程帮助记录日 志,为何不自己记录呢,那是因为syslogd非常的专业,可以将日志记录到很细的地步,可以看etc/下面的配置文件,既然所有的进程都可以委托 syslogd记录日志,那么就涉及到了进程间通信,这就是linux中另外一大块的内容了,这里就不谈了,linux善于使用小的程序组合成大的机 制,linux善于分布式的思想而不是集中的,但是为何将日志都委托给一个守护进程呢,这不就集中了吗?其实这难道不是各司其职吗?因此这还是一个边界的 问题。syslogd之外还有一个klogd,这两个其实不是一个层次的,syslogd是个总的日志记录器,而klogd仅仅是一个syslogd的客 户端罢了,和很多需要记录日志的进程的级别一样,在需要记录日志的进程里,可以调用syslog函数将日志发送给syslogd守护进程,可是内核并不是 一个进程,那么它的日志就有必要专门设置一个用户进程负责传给syslogd,这个进程就是klogd,至于klogd如何从内核得到内核日志信息,这就 是它自己的事情了,其实内核专门留下了两个日志接口,一个是sys_syslog系统调用(注意不要和syslog函数混淆,syslog系统调用是和内 核通信的,而syslog函数是和syslogd通信的),另一个是/proc/kmsg文件,klogd使用的是后者,当然也可以直接使用 ksyslog系统调用。这里首先看一下内核日志的一些结构,首先内核日志大多数由printk产生,你也可以认为完全由printk产生,但是我们知 道,printk将信息打印到了屏幕,并没有别的什么副作用,实际上并不是仅仅发生了我们看到的事情,实际上printk并不是将信息直接写入了标准输出 文件,而仅仅将信息塞入了一个环形缓冲区,然后至于这个缓冲区的内容什么时候显示到标准输出,那就是另外一个事情了,而内核日志就是存在于这个环形缓冲 区,打印到屏幕的仅仅是一个缓冲区副本,真正的数据还在缓冲区保留,只有到了klogd或者别的什么调用syslog系统调用将信息读出时或者缓冲区满了 (环形缓冲区首尾相接)的时候才会清除部分数据或者全部数据,刚才说了有两种方式来得到内核日志,一个是/proc/kmsg。一个是系统调用,幸运的是,这两个都是调用了do_syslog内核函数。建立“缓冲存储池”,是数据库连接池的基本设计思想。这种技术类似于CPU 中的Cache 技术,将预先设定好的数据库连接放入该缓冲池中,当要建立数据库连接操作时,便从池中取出一个连接,使用完毕后再将其放回。这样就达到了连接复用的目的,应用程序重复使用一个数据库连接,在多层结构的应用程序中通过连接池技术可以使系统的性能明显得到提到。最为关键的是,该方法避免了对数据库连接的频繁建立、关闭,减小了系统开销,提高了响应速度。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量使用情况,为系统开发测试及性能调整提供依据。数据库连接池属于应用程序对底层的调用,用户并发访问应用程序时会提交访问请求,然后通过线程来处理这些请求,并向连接池申请一个对数据库操作的连接,操作完毕后将连接释放4.1内核日志与接口多用途的 syslog 系统调用提供了内核的日志缓冲区访问方法。这个调用执行了很多个操作,所有操作都可以在用户空间执行,但是只有一个操作可以被非 root 用户执行。syslog 系统调用的原型定义位于 ./linux/include/linux/syslog.h;而它的实现位于 ./linux/kernel/printk.csyslog 调用是作为内核日志消息环缓冲区的输入/输出(I/O)和控制接口。通过 syslog 调用,应用程序可以读取日志消息(部分、整体或者只读取新消息), 以及控制环缓冲区的行为(清除内容、设置日志的消息级别、启用或禁用控制台等等)。用图形说明了使用所讨论的主要组件进行日志记录的过程如下图 4-1:图 4-1 日志记录过程图syslog调用(在内核中调用 ./linux/kernel/printk.c 的do_syslog)是一个相对较小的函数,它能够读取和控制内核环缓冲区。注意在 glibc 2.0 中,由于词汇syslog使用过于广泛,这个函数的名称被修改成klogctl,它指的是各种调用和应用程序。syslog和klogctl(在用户空间中)的原型函数定义为:int syslog( int type, char *bufp, int len );int klogctl( int type, char *bufp, int len );type参数是用于传递所执行的命令,它指定了可选的缓冲区长度。有一些命令(如清除环缓冲)是忽略bufp和len这两个参数的。虽然前面两个命令类型不会对内核进行任何操作,但是其余命令则是用于读取日志消息或控制日志。其中有三个命令是用于读取日志消息的。SYSLOG_ACTION_READ用于阻塞操作,直至日志消息到达后才释放该操作,然后将它们返回到所提供的缓冲区。这个命令会处理这些消息(旧的消息将不会出现在这个命令的后续调用中)。SYSLOG_ACTION_READ_ALL命令会从日志读取最后n个字符(而n是在传递给klogctl的参数len中定义的)。SYSLOG_ACTION_READ_CLEA命令会先执行SYSLOG_ACTION_READ_ALL操作,然后执行SYSLOG_ACTION_CLEAR命令(清除环缓冲区)。SYSLOG_ACTION_CONSOLEON 和 OFF 可以将日志级别设置为激活或禁用日志消息输出到控制台,而SYSLOG_CONSOLE_LEVEL则允许调用者定义控制台所接受的日志消息级别。最后,SYSLOG_ACTION_SIZE_BUFFER是用于返回内核环缓冲区大小,而SYSLOG_ACTION_SIZE_UNREAD则返回当前内核环缓冲区可读取的字符数。表 2 显示了SYSLOG命令的完整清单。SYSLOG_ACTION_CLOSE (0)关闭日志(未实现)SYSLOG_ACTION_OPEN (1)打开日志(未实现)SYSLOG_ACTION_READ (2)从日志读取SYSLOG_ACTION_READ_ALL (3)从日志读取所有消息(非破坏地)SYSLOG_ACTION_READ_CLEAR (4)从日志读取并清除所有消息SYSLOG_ACTION_CLEAR (5)清除环缓冲区SYSLOG_ACTION_CONSOLE_OFF (6)Disableprintks to the consoleSYSLOG_ACTION_CONSOLE_ON (7)激活控制台printkSYSLOG_ACTION_CONSOLE_LEVEL (8)将消息级别设置为控制接受SYSLOG_ACTION_SIZE_UNREAD (9)返回日志中未读取的字符数SYSLOG_ACTION_SIZE_BUFFER (10)返回内核环缓冲区大小表4.1 SYSLOG命令清单4.2实现命令在实现上面的syslog/klogctl层之后,kmsg proc 文件系统成为一个 I/O 通道(在 ./linux/fs/proc/kmsg.c 中实现的),它提供了从内核缓冲区读取日志消息的二进制接口。这个读取操作通常是由一个守护程序(klogd或rsyslogd)实现的,它会处理这些消息,然后将它们传递给rsyslog,以便(基于它的配置)转发到正确的日志文件中。文件 /proc/kmsg 实现了少数等同于内部do_syslog的文件操作。在内部,open调用与SYSLOG_ACTION_OPEN有关,而SYSLOG_ACTION_CLOSE则与release有关(每一个调用都实现为一个 No Operation Performed NOP)。这个轮循操作会等待文件活动的完成,然后才调用SYSLOG_ACTION_SIZE_UNREAD确定可以读取的字符数。最后,read操作会被映射到SYSLOG_ACTION_READ,以处理可用的日志消息。注意,用户是不会用到 /proc/kmsg 文件的:守护程序用它来获取日志消息,并将它们转发到 /var 空间内必要的日志文件中。4.3用户空间应用程序用户空间提供了许多读取和管理内核日志的访问方法。我们开始先介绍较底层的接口(如 /proc 文件系统配置元素),然后再介绍更高层的应用程序。/proc 文件系统不仅提供了一个访问日志消息(kmsg)的二进制接口。它还有许多与上面讨论的syslog/klogctl相关或无关的配置元素。清单 1 显示了这些参数。这些日志级别表示了控制台的日志级别、默认消息日志级别、最小控制台日志级别和默认控制台日志级别。printk_delay值表示的是printk消息之间的延迟毫秒数(用于提高某些场景的可读性)。注意,这里它的值为 0,而它是不可以通过 /proc 设置的。printk_ratelimit定义了消息之间允许的最小时间间隔(当前定义为每 5 秒内的某个内核消息数)。消息数量是由printk_ratelimit_burst定义的(当前定义为 10)。如果您拥有一个非正式内核而又使用有带宽限制的控制台设备(如通过串口), 那么这非常有用。注意,在内核中,速度限制是由调用者控制的,而不是在printk中实现的。如果一个printk用户要求进行速度限制,那么该用户就需要调用printk_ratelimit函数。dmesg命令也可用于打印和控制内核环缓冲区。这个命令使用klogctl系统调用来读取内核环缓冲区,并将它转发到标准输出(stdout)。这个命令也可以用来清除内核环缓冲区(使用-c选项),设置控制台日志级别(-n选项),以及定义用于读取内核日志消息的缓冲区大小(-s选项)。注意,如果没有指定缓冲区大小,那么dmesg会使用klogctl的SYSLOG_ACTION_SIZE_BUFFER操作确定缓冲区大小。最后,所有日志应用程序都是基于一个标准化日志框架syslog,主流操作系统(包括 Linux 和 Berkeley Software Distribution BSD)都实现了这个框架。syslog使用自身的协议实现在不同传输协议的事件通知消息传输(将组件分成发起者、中继者和收集者)。在许多情况中,所有这三种组件都在一个主机上实现。除了syslog的许多有意思的特性,它还规定了日志信息是如何收集、过滤和存储的。syslog已经经过了许多的变化和发展。您可能听过syslog、klog或sysklogd。最新版本的 Ubuntu 使用的是名为rsyslog(基于原先的syslog)的新版本syslog,它指的是可靠的和扩展的syslogd。rsyslogd守护程序通过它的配置文件 /etc/rsyslog.conf 来理解 /proc 文件系统的kmsg接口,并使用这些接口获取内核日志消息。注意,在内部,所有日志级别都是通过 /proc/kmsg 写入的,这样所传输的日志级别就不是由内核决定的,而是由rsyslog本身决定的。然后这些内核日志消息会存储在 /var/log/kern.log(及其他配置的文件)。在 /var/log 中有许多的日志文件,包括一般消息和系统相调用(/var/log/messages)、系统启动日志(/var/log/boot.log)、认证日志(/var/log/auth.log)等等。虽然您可以检查这些日志,但是您也可以使用它们进行自动审计和检查。有许多日志文件分析器可以用于故障修复, 或者满足安全规范要求,以及自动地使用诸如模式识别或相关性分析(甚至是跨系统的)来发现问题。 第6章 系统测试第5章 程序设计和流程图5.1设计思路本课题是采用C/S模式。客户程序功能是界面的编写,并和服务程序通信。采用GTK编写界面,采用Sock编程实现通信。服务器程序功能是接收客户程序的数据,并且通过收到的数据来完成系统或应用服务程序文件的配置。在Linux中服务配置文件主要是以文本文件的形式存在的,所以通过Linux系统调用很容易修改配置文件,流程如图5-1:图5-1 程序总体流程5.2服务程序5.2.1流程设计服务程序功能有两个:一是监听端口,接收数据和向客户程序发送数据;二是根据客户程序发送过来的数据对文件修改,其流程图如图5-2所示。图5-2显示了服务程序的流程,accept()是监听端口,等待客户程序的连接,连接建立好后init_clinet()函数从配置文件读取服务器的当前配置文件数据,然后再发送到客户程序,让客户程序通过这些数据来初始化界面。然后再接收客户程序的数据(流程控制字符串),通过判断字符串来控制服务程序的流程(图5-2中的虚线部分)。图5-2 服务程序的流程图5.2.2功能模块(1)系统用户管理操作和客户程序建立了连接,并且收到了user字符串后,服务程序进入系统用户管理操作模块,接着接收客户程序发送过来的数据(字符串),通过数据来判断是对用户的添加、删除、浏览或修改操作。接收到了“adduser”字符串就进入添加用户流程;接收到“deluser”字符串就进入删除用户流程;接收到“scanuser”字符串就进入了浏览用户流程;接收到“property”字符串就进入到了修改用户流程,系统用户管理操作流程如图5-3所示:user_control()recv()字符recv()recv()recv()fopen()propertyscauseradduserexitsend()fget()把接受的数据格式化存储在字符串str中把接受的数据格式化存储在字符串str中fopen()fget()为空相同把读取数据存到2维数组temp中接收的字符和读取字符不同fopen()把读取数据存到2维数组temp中fopen()fget()为空否是fget()fclose()把str存到2维数组temp中把读取数据存到2维数组temp中否是fopen()把temp中的数据fputs()到文件中fclose()相同接收的字符和读取字符不同否为空fopen()把temp中的数据fputs()到文件中fclose()fopen()退出用户操作到图3的recv()fputs(str)把temp的数据fputs()到文件图5-3 系统用户管理操作流程图对用户的操作是添加、删除和修改用户,Linux用户都是记录在/etc/passwd文件中,对用户添加、删除和修改都是通过修改/etc/passwd文件来实现。/etc/passwd的用户都是按照统一存格式来存储,格式举例如下:terrycheops:x:500:500:terrycheop:/home/terrycheops:/bin/bash存储中每个字段都用“:”隔开的,第一字段:用户名(也被称为登录名),在上面的例子中,我们看到用户的用户名是terrycheops;第二字段:口令,在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中;第三字段:用户的ID;第四字段:用户组的ID;第五字段:用户名全称,可选项;第六字段:用户的家目录所在位置,该用户的是/home/terrycheops。第七字段:用户所用Shell的类型,一般设置为/bin/bash。程序进入到了添加用户后,接收客户程序传过来要添加的用户信息(用户名、密码、全名)。把客户程序发送过来的用户密码用MD5算法加密,把加密后的密码和用户其他数据按照/etc/passwd的格式复制到字符串变量(str)中。用C语言的流的读操作打开文件/etc/passwd,读取/etc/passwd中的每一行,把每次读取的数据都复制到二维数组(temp)中,关闭文件。再以写的形式打开文件,然后把上面二维数组(temp)的内容写到文件中,最后再把变量(str)写到文件中,这样就实现了用户的添加。程序进入到了删除用户流程后,接收客户程序要删除用户的用户名。用C中流的操作打开文件/etc/passwd,判断读取的数据,当要删除的用户名和读取的用户名一致时就不把这个用户信息复制到二维数组(temp);读取用户名和删除用户名不一样就把读取数据复制到temp中。然后关闭这个流。重新以写文件的操作打开文件/etc/passwd,然后把二维数组(temp)中的数据的以流的形式在写入到文件/etc/passwd中,这样就实现了用户的删除。用户修改过程,接收客户程序发送过来的数据后,把接收的数据格式化复制到str中。以C语言中流的操作打开并且读取文件/etc/passwd的数据,判断读取的数据,当要修改的用户名和读取的用户名一致时把str数据复制到二维数组(temp);读取用户名和修改的用户名不一致时就把读取数据复制到temp中。然后关闭这个流。重新以写文件的操作打开文件/etc/passwd,然后把二维数组(temp)中的数据以流的形式再写入到文件/etc/passwd中,这样就完成了修改用户的操作当进入浏览用户的流程后,打开/etc/passwd文件,把文件的数据读取到buff中,再关闭文件,把buff的数据发送的到客户程序,让客户程序显示当前的用户信息。(2)系统用户组的操作用户组(Group)配置文件主要有 /etc/group和/etc/gshadow,其中/etc/gshadow是/etc/group的加密信息文件。etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特征。对组的操作都是通过修改/etc/group来实现的,主要是对组的添加删除和修改。进入到组添加流程后,接收客户端发送过来要添加的组的信息,然后把接收的数据格式按照/etc/group存储格式格式化后复制到str中。然后打开文件/etc/group,读取文件中组的数据复制到二维数组(temp)中,关闭文件。在打开文件/etc/group把temp的数据写到文件中去,最后把str写入到文件中,关闭文件,这样就实现了组的添加。组的删除过程,读取客户程序发送过来的数据,然后打开/etc/group文件,读取文件的数据,当读取的数据和发送过来的组名一样,就不把读取数据复制到二维数组(temp)中,其它都把读取的数据复制到temp中,关闭打开的文件。再次打开文件/etc/group,把temp的数据都写到文件中,关闭文件,这样就完成组的删除操作。组的修改过程,接收客户端发送过来要添加组的信息,然后把接收的数据格式按照/etc/group存储格式格式化后存复制到str变量中。然后打开/etc/group文件,读取文件的数据,当读取的数据和发送过来的组名一样,就把str复制到temp中,其它都把读取的数据复制到temp中,关闭打开的文件。再次打开文件/etc/group,把temp的数据都写到文件中,关闭文件,这样就完成组的修改操作。浏览组的过程,当程序到了浏览组的流程后,打开/etc/group文件,把文件的数据读取到buff中,再关闭文件,把buff的数据发送的到客户程序。让客户程序显示当前的用户信息。用户组操作的流程如图5-4所示:fopen()fget()把读取数据存到2维数组temp中为空fopen()exitgroupaddgroupscangroup_control()recv()字符recv()recv()property把接收的数据格式化存储在字符串str中fclose()fopen()把temp中的数据fputs()到文件中fputs(str)fopen()fget()为空相同把读取数据存到2维数组temp中接收和读取字的符不同是否否是fclose()把temp中的数据fputs()到文件中recv()把接收的数据格式化存储在字符串str中fopen()把读取数据存到2维数组temp中fget()把str存到2维数组temp中fclose()fopen()把temp中的数据fputs()到文件中相同接收和读取的字符不同否为空是fopen()fget()send()退出组的操作到图3的recv函数图5-4 组操作流程(3)系统服务启动管理系统服务启动管理和其他的操作不大一样,其他的操作是通过修改配置文件来实现的,而系统服务的启动是通过添加和删除链接文件来完成的。其流程如图5-5所示。InitAction ()recv ()第1个字符10link(“/etc/init.d/named”, “/etc/rc.d/rc5.d/S11named”)unlink(“/etc/rc.d/rc5.d/S11named”)第2个字符10link(“/etc/init.d/httpd”,“/etc/rc.d/rc5.d/S85httpd”)unlink(“/etc/rc.d/rc5.d/S85httpd”)第3个字符10link(“/etc/init.d/sendmail”, /etc/rc.d/rc5.d/S80sendmail”)unlink(“/etc/rc.d/rc5.d/ S80sendmail”)第4个字符10link(“/etc/init.d/dhcp”, “/etc/rc.d/rc5.d/S65dhcpd”)unlink(“/etc/rc.d/rc5.d/ S65dhcpd”)第5个字符10link(“/etc/init.d/smb”, “/etc/rc.d/rc5.d/S91smb”)unlink(“/etc/rc.d/rc5.d/ S91smb”)退出系统启动服务管理到图3的recv()图5-5 系统启动服务管理流程服务程序进入到图5-2的InitAction()函数就进入了系统服务启动管理流程,接收客户程序发送过来的数据,这里发送过来的是一个有5个字符串的数组。判断字符串的第1个字符,如果是1的话就调用系统调用link()把/etc/init.d/named shell脚本链接为/etc/rc.d/rc5.d/S11named文件;如果字符是0就调用unlink()取消/etc/rc.d/rc5.d/S11named文件的链接。然后再判断第2个字符,是1就把/etc/init.d/http shell文件链接为/etc/rc.d/rc5.d/S85httpd文件;如果第2个字符是0,就取消文件/etc/rc.d/rc5.d/S85httpd的链接。然后判断第3个字符,是1就调用系统linnk()函数把/etc/init.d/sendm链接到/etc/rc.d/rc5.d/S80sendma,是0就取消对/etc/rc.d/rc5.d/S80sendmail的链接。然后就判断第4个字符的值,如果是1话就把/etc/init.d/dhcp hell脚本链接为文件/etc/rc.d/rc5.d/S65dhcpd,是0就取消对/etc/rc.d/rc5.d/S65dhcpd的链接。最后再判断第5个字符,是1就把文件/etc/init.d/smb为文件/etc/rc.d/rc5.d/S91smb。否则就取消对/etc/rc.d/rc5.d/S91smb的链接。(4)DNS管理操作图5-2的程序流程到Net_DNS_Config()函数就进入DNS功能模块了。该模块主要是为在DNS中添加和删除zone;在zone中添加和删除domain。进入该模块后,服务程序会接收一个客户程序发送的数据,该数据用来控制DNS模块的流程,其流程如图5-6所示:图5-6 DNS流程图添加zone操作先接收客户程序发送过来的数据(要添加的zone名字和类型),通过zone的名字加入点格式后在判断配置文件中有没有zone存在,如果存在就发送一个“zone name is exist”字符串到客户端,退出DNS配置,不存在再把zone字和类型格式化为/var/named/chroot/etc/named.conf中zone存储格式,然后把格式化后的数据存储到配置文件中,存储成功后发送“zone add succseed”到客户程序。删除zone操作先接收客户程序发送过来的数据(要删除的zone名),判断配置文件中是否有发送过来zone名存在,如果没有就向客户发送“zone name is not exist”字符串;如果有就读取配置文件的数据到内存(buff)中,再把buff内存中的数据删除要删除的部分,然后再把buff中的数据写入到配置文件中。写入成功后发送“zone delete succsed”字符串到客户程序。添加domian操作先接收客户程序发送过来的数据(要添加的domain名,IP和zone名),然后判断/var/named/chroot/etc/named.conf中是否有这个zone存在,没有就发送“zone name is not exist”到客户程序,如果有就得到其数据文件名字。然后把domian和IP格式化后写入到数据文件中。删除domain操作先接收客户程序发送的数据(要删除的domain,和zone),然后判断/var/named/chroot/etc/named.conf中是否有这个zone存在,如果没有就发送“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论