h20xx032045_一种远程管理linux系统工具的设计与实现内容摘要:

ist *clist,gint row )。 与其他构件一样, GtkCList有一些信号供我们使用。 GtkCList构件是从容器 构件 GtkContainer派生的,它有容器所具有的一些信号,还有下面这些附加信号: 第 页 共 33 页 5 select_row:选中一行时引发,该信号传递信息,依次是 GtkCList *clist、 gint row、 gint column、 GtkEventButton *event。 unselect_row:用户对一行取消选择,引发这个信号。 传递的信息与上一个 信号一样。 click_column:选中某一列时引发,传递信息,依次是: GtkCList *clist、 gint column。 所以,要将一个回调函数连接到 select_row信号上,回调函数应 该像下面这样: void select_row_callback(GtkWidget *widget,gint row,gint column, GdkEventButton *event,gpointer data)。 回调函数用下面的形式连接到信号: gtk_signal_connect(GTK_OBJECT( clist), select_row, GTK_SIGNAL_FUNC(select_row_callback), NULL)。 以 上只是简单介绍了本课题在客户端界面编写的时候可用到的 GTK库函数, 但实际的 GTK比上面的操作还要复杂得多。 3 Linux 系统调用 Linux 系统文件 在 Linux 中最主要的资源就是文件,很多设备都是以文件形式存在的,所 以大多数输入 /输出都要通过文件读写来实现。 也就是说通过一个单一的接口就 可以处理外围设备和程序之间的通信。 Linux 文件类型常见的有:普通文件、 目录、字符设备文件、块设备文件、符号链接文件等。 很多系统服务和应用服 务的配置文件都是以普通文件的形式存在 ,这些文件很容易通过 Linux 的系统 调用来配置和修改,也可以用文档文件的修改方式来修改。 如何从文件中读取数据 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)。 第 页 共 33 页 6 第 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。 进程和线程的使用 (1) Linux 进程 Linux 进程创建很特别。 很多其他操作都提供了产生进程的机制,在新的 进程空间中创建进程,读取可执行文件。 但是 Linux 不同,它创建的子进程具 有和父进程相同的数据、代码段。 父进程和子进程间的区别就是进程的 pid 不 同,其他的都一样: pid_t result = fork(void) 该函数比较特殊,它返回两次函数值,一次返回值是向父进程返回子进程 的 PID。 还有一次是返回 0(子进程 )。 在使用 fork()函数创建进程的时候经常父进程等待子进程结束。 系统调用 wait(amp。 status)让父进程阻塞直到子进程结束: pid_t result = wait(amp。 status)。 (2) Linux 线程 进程为线程提供了运行环境,多个函数可以同时运行,但是他们都是运行 在相同的进程中的。 pthread_cearte()函数可以创建一个线程: int pthread_ceate(pthread_t *thread, pthread_attr_t *attr, void *(*func)(void*), void *arg)。 4 基本的套接口编程 概述 让同一网络的不同计算机的进程能够相互通信,首先要确定这些程序如何 第 页 共 33 页 7 进行通信。 本课题所用的协议是 TCP/IP 协议。 如果客户和服务器处于同一以太 网,如图 1 所示。 应用层协议 客户应用程序 服务器应用程序 TCP TCP 协议 TCP IP IP 协议 IP 以太网驱动 以太网协议 以太网驱动 图 1 网络示意图 简单的网络编程 (1) socket 函数 socket 函数功能是创建一个套接口描述符,并且指定希望的通信 协议 (使 用 IPV4 的 TCP,或者使用 IPV6 的 UPD 等 )。 int socket(int family,int type,int protocol)。 其中 family 参数指明协议族, type 参数指明套接口类型, protocol 参数 为某个协议的常数。 函数调用成功时候返回一个非负的描述符。 (2) connect 函数 TCP 客户程序用 connect 函数来发起和 TCP 服务程序的连接。 这个函数通 常是在客户程序中使用。 int connect(int sockfd, const sgruct sockaddr *servaddr, socklen_t addrlen)。 sockfd 是有 socket 函数返回的一个套接口描述符,第 2 个和第 3 个参数 分别是一个指向套接口地址结构指针和结构的大小。 当函数调用成功的时候返 回 0,出错就返回 1。 (3) bind 函数 该函数是把一个本地协议地址赋予一个套接口,对于网际协议,协议地址 是一个 32 位的 IPV4 地址和一个 16 位的 TCP 端口号的组合。 int bind(int sockfd,const struct aockaddr *myadd,socklen_t addrlen)。 第 页 共 33 页 8 第 2个参数是一个指向特定协议的地址结构的指针,第 3 个参数是该地址 结构的长度。 调用成功返回 0,错误返回 1。 (4) listen 函数 listen 函数只能由 TCP 服务器调用,他完成两件事: 一是当 socket 函数创建一个套接口时它是一个主动的套接口,该函数就是 把它转换成一个被动的套接口 二是该函数规定了为相应套接口排队的最大的连接个数。 int listen(int sockfd,int backlog)。 本函数通常都是在调用 socket 和 bind 这两个函数之后。 (5) accept 函数 int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)。 参数 cliaddr 和 addrlen 用来返回已经连接的客户端的协议地址。 函数返 回值为一个非负的描述符表示成功,出错为 1。 这里需要指出的是参数的描述符为监听套接口,就是 在等待连接的时候还 没有建立连接的套接口,而返回值是连接的新的套接口。 也就是能和客户端通 信的套接口。 区分这两个东西是很重要的。 (6)close 函数 套接口编程通常都需要一个 close 函数来关闭套接口 ,来中断 TCP 的连接。 int close(int sockfd)。 (7)send()函数 当连接建立了后自然就需要数据的传送和接收, send()函数是用来想连接 的另外一端发送数据。 int send(int sockfd,void *buf,int len,int flags)。 第 1个参数是已经连接的套接口的描述符,第 2 个参数是发送的数据的内 存地址,第 3 个参数是发送数据的大小,第 4 个参数是选项。 (8)recv()函数 数据发送到接收端了后,就可以用 recv()函数来接收由发送端发送过来的 数据了。 int recv(int sockfd,void *buf,int len,int flags) 第 1个参数是已经连接的套接口的描述符,第 2 个参 数是发送的数据的内 存地址,第 3 个参数是发送数据的大小,第 4 个参数是选项。 第 页 共 33 页 9 5 程序设计和流程图 设计思路 本课题是采用 C/S 模式。 客户程序功能是界面的编写,并和服务程序通信。 采用 GTK 编写界面,采用 Sock 编程实现通信。 服务器程序功能是接收客户程序 的数据,并且通过收到的数据来完成系统或应用服务程序文件的配置。 在 Linux 中服务配置文件主要是以文本文件的形式存在的,所以通过 Linux 系统调用很 容易修改配置文件,流程如图 2。 main() 等待连接 输入服务 器 IP 建立连接( TCP3 次握手) 连接界面 连接 成功 连接不成功 初始化数据 TCP 接口 用户主界面 用户操作 否 TCP 接口 退出 处理 请求 退出 是 结束 结束 图 2 程序总体流程 服务程序 流程设计 服务程序功能有两个:一是监听端口,接收数据和向客户程序发送数据; 二是根据客户程序发送过来的数据对文件修改,其流程图如图 3 所示。 图 3显示了服务程序的流程, accept()是监听端口,等待客户程序的连接, 连接 建立好后 init_cli()函数从配置文件读取服务器的当前配置文件数 据,然后再发送到客户程序,让客户程序通过这些数据来初始化界面。 然后再 接收客户程序的数据 (流程控制字符串 ),通过判断字符串来控制服务程序的流 程 (图 3 中的虚线部分 )。 第 10 页 共 33 页 程序入口 sock() bind() listen() accep() 一直阻塞到 客户连接到 达 连接建立 TCP3 次握 手 init_cli () close () recv () 字符串 对字符 判断处理 判断 user group sysconfig dnsconfig apachecon exit vsftpcon user_control() InitAction () group_control() Apache_Config () Net_DNS_Config () Ftp_Config () 图 3 服务程序的流程图 功能模块 (1) 系统用户管理操作 和客户程序建立了连接,并且收到了 user 字符串后,服务程序进入系统用 户管理操作模块,接着接收客户程序发送过来的数据 (字符串 ),通过数据来判 断是对用户的添加、删除、浏览或修改操作。 接收到了 adduser字符串就进 入添加用户流程;接收到 deluser字符串就进入删除用户流程;接收到 scanuser字符串就进入了浏览用户流程;接收到 property字符串就进 入到了修改用户流程,系统用户管理操作流程如图 4 所示。 第 11 页 共 33 页 user_control() recv()。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。