linux 管理工具 gtk.docx
《linux 管理工具 gtk.docx》由会员分享,可在线阅读,更多相关《linux 管理工具 gtk.docx(28页珍藏版)》请在冰豆网上搜索。
linux管理工具gtk
摘要
Linux是一种自由和开放源代码的类Unix操作系统,可安装在各种计算机硬件设备中。
完全免费,稳定,功能强大的特性吸引了大量的用户。
Linux强大的功能是通过命令的形式展现出来的,即使用者必须学习Linux中提供的命令以及各种选项,增加了Linux用户使用Linux的难度。
为了方便使用和管理Linux系统,提供图形化的用户界面,系统采用C/S模式,使用GTK实现图形界面的编写,实现远程管理Linux的一种管理工具。
本系统以C/S模式实现,在客户端,采用GTK编程来实现操作界面。
在服务器端,选用linux系统的文件调用函数来读写配置文件中的数据。
采用SockTCP编程来实现客户端和服务器端之间的数据通信。
该系统主要功能实现对Linux系统用户和组的添加,删除,对应系统应用服务系统启动管理)进行管理和配置。
本论文是以系统的开发为主线,从软件设计的角度对系统的理论基础、系统整体架构及系统具体设计进行了详细研究。
关键词:
Linux;系统服务;GTK;Socket
Abstract
LinuxisafreeandopensourcecodeintheUnixoperatingsystem,canbemountedinavarietyofcomputerhardwareequipment.Completelyfree,stable,powerfulfeaturestoattractalargenumberofusers.PowerfulfunctionofLinuxthroughthecommandform,i.e.theusermustlearnLinuxprovidedinthecommandaswellasavarietyofoptions,increasedLinuxuserismoredifficulttouseLinux.InordertofacilitatetheuseandmanagementofLinuxsystem,providesthegraphicaluserinterface,systemusesC/Smodel,usingGTKachievegraphicalinterfaceprogramming,realizetheremotemanagementofLinuxofamanagementtool.
ThesystemisimplementedbasedonthemodelofC/S.Intheclient,theoperatinginterfaceismadebytheprogrammingofGTK.Intheserver,thefunctionsoftransferringoffilesoflinuxoperatingsystemareusedtowriteandreadthedataoftheconfigurationfiles.ThecommunicationofclientandserverisimplementedbytheprogrammingofsockTCP.
Themainfunctionsofthesystemincludeaddtion,deletionofusersandgroupsofLinuxoperatingsystemandconfigurationandmanagementoftheserviceofapplicationofthesystem,suchasthethemanagementofbootingservice.
Thispaperisbasedonthesystemdevelopment,studiedthetheoreticalfoundationofthesystem,theoverallarchitectureofthesystem,thespecificdesignofthesystemindetailfromtheperspectiveofsoftwaredesign.
Keywords:
Linux;SystemService;GTK;Socket
目录
1绪论1
1.1本文的研究背景1
1.2本文的研究目的和主要工作1
2GTK编程2
2.1GTK简介2
2.2GTK开发环境的搭建3
2.3GTK构件3
3Linux系统调用6
3.1Linux系统文件6
3.2Linux中文件I/O6
3.3Linux中进程和线程的使用6
4套接口编程8
4.1简介8
4.2socket编程相关的结构体8
4.3socket编程相关的函数9
5程序设计和流程图11
5.1设计思路11
5.2服务器端程序设计12
5.2.1流程设计12
5.2.2服务器端功能模块14
5.3客户端程序设计18
5.3.1客户端设计思路18
5.3.2客户端程序设计18
5.4系统测试26
结论27
参考文献28
致谢29
1绪论
1.1本文的研究背景
Linux是一种自由和开放源码的类Unix操作系统。
Linux作为开源项目的代表,很多大的硬件厂商也支持Linux的发展,由于Linux的稳定性和强大的功能,基于Linux平台的网络服务也在持续的增长。
但是Linux的强大功能是通过命令以及选项的方式提供的,使用者必须记忆较多的命令以及相关选项的功能和作用。
提高了使用的难度,增加了工作量,同时缺乏统一管理和维护Linux中服务的软件[1]。
1.2本文的研究目的和主要工作
本课题是为了给系统管理员提供一种远程管理Linux中某些主要服务的工具软件,完成服务配置管理和查看一些重要数据。
由于Linux是开源项目的代表,对Linux的学习有助于对计算机系统和软件理论知识的提高。
通过该课题的设计与实现,既解决远程管理Linux系统,又让自己掌握了一些Linux系统编程和Socket的编程能力。
本课题主要是对网络配置、GTK库、Linux系统调用和网络编程方面的研究,采用C/S模式,在客户端采用GTK函数实现用户界面的编写,在服务器端通过Linux的系统调用来实现本地服务配置,然后再通过Sock编程来实现服务器和客户端的通信,传递配置内容和服务指令[2]。
2GTK编程
2.1GTK简介
GTK(GIMPToolkit,GIMP工具包)是一套跨多种平台的图形工具包。
按LGPL许可协议发布的。
虽然最初是为GIMP写的,但目前已发展为一个功能强大、设计灵活的通用图形库。
特别是被GNOME选中使得GTK+广为流传,成为Linux下开发图形界面的应用程序的主流开发工具之一。
GTK是一种面向对象式的API(applicationprogramminginterface)。
Glib是GTK+的基础,而这种面向对象的系统正是有glib提供的[3]。
GObject即面向对象的基制可以为GTK+绑定多种开发语言,目前存在的语言有:
C++,Python,Perl,Java,C#,PHP等。
GTK+依赖Glib,Pango,ATK,GDK,GdkPixbuf,Cairo。
Glib是一种通用的函数库。
她提供了各种各样的语言特性,如数据类型,字符串函数,错误通知,消息队列和线程。
Pango是一种函数库,用来实现国际化和本地化的功能。
ATK是一种平易近人的工具函数包,提供快捷服务或为特定人提供电脑服务。
GDK为GTK+图形库系统提供了一些底层的图形实现和窗口实现方法。
在Linux中GDK是位于X服务器和GTK+函数库之间的。
在最近的GTK发行版本中,将更多的功能性函数放在了Cairo函数库中。
GdkPixbuf是加载图像和维护图像缓存的函数库工具包。
Gnome和XFce桌面环境系统均由GTK+编程实现,著名的编程框架SWT和wxWidgets也是由GTK+编程实现的。
最杰出的GTK+软件的代表是Firefox和Inkscape。
GTK+中,运行主循环使用的是gtk_main函数,主要用于监视X服务与GTK程序的连接,退出主循环使用的是gtk_main_quit函数。
GTK+程序中函数的调用是通过信号与事件触发实现的,它的实现机制为:
程序运行在gtk_main()主循环中,某个特定的事件发生,控制权交付给子函数,进而执行这个子函数,实现特定的功能。
另外,在程序编写过程中经常要对回调函数的指针类型进行转换,为此GTK+提供了一种宏定义G_CALLBACK实现,该宏的信息如下:
#defineG_CALLBACK(f)((GCallback)(f))事件是指从X服务器收到的信息流,事件与信号的区别在于:
信号是对象发出的,而事件是在XWindows中发生的动作,如鼠标的移动、点击等。
GTK+构件在接收到发生的事件之后就会发出相应的信号,进而调用回调函数。
事件的回调函数与信号的回调函数是有所区别的,事件的回调函数为:
gintcall_back_func(GtkWidget*widget,GdkEvent*event,gpointercallback_data);
参数event是指向联合类型GdkEvent的指针。
2.2GTK开发环境的搭建
实现远程管理工具的开发,首先要正确的搭建开发环境。
由于系统的设计和实现是在Linux中,而主机使用的Windows系统,所以通过VMwareWorkstation解决这一问题。
VM即virtualmachine,虚拟机是通过软件模拟出来的计算机,也就是逻辑上的计算机。
Host是物理存在的计算机,hostos是host上运行的操作系统。
Guest是虚拟出来的计算机,guestos是虚拟机上运行的操作系统。
Host与guest之间是完全隔离和独立的,它们可以同时运行而互不影响。
对于host来说guest就host下的文件,而在guest里,可以有自己的操作系统和运行自己的应用程序,guest能够实现一台真正的计算机的功能。
Linux系统完全免费,且有较多的版本和类型供使用者选择,系统的开发环境选择redhat5.1,具体的搭建环境的过程是在windowsxp系统中,安装vmware,然后在vmware中安装redhat,在安装redhat中,应注意vmware提供了对redhat的easyinstall,easyinstall不提供个性化的选择和设置,不会安装开发环境,所以选择自己安装,在安装中选中开发所需的包和软件,将GTK的开发环境选上即可。
在系统开发中用到开发工具有GNU的GCC编译器,GDB调试器,VIM编辑器,make工具,pkgconfig,gtk。
gcc是gnu提供gnuccompiler,用于Linux下编译C程序。
gdb是一款功能强大的调试工具,在编译时加上-g选项,就可以运行gdb来调试程序,用来查找程序中的逻辑错误。
在系统中使用了make工具,make是一个方便编译和维护工程的工具,工程通常是由程序文件和头文件,以及其它的相关文件组成,如果通过命令的形式会比较麻烦,并且容易出错,借助于make,可以将文件之间的依赖关系写入Makefile文件中,然后使用make编译和维护,make会自动在当前目录下寻找名为Makefile的文件,然后读取Makefile文件的内容,由文件的更新时间和依赖关系,确定编译的先后次序,并进行编译。
pkgconfig是包配置管理工具,用于在指定的目录中通过.pc结尾文件查找配置gtk使用的库文件,在编译gtk图形程序时用到,通常是在gcc编译命令之后加上
`pkgconfig–cflags–libsgtk+-2.0`,用于加载gtk所需的库文件。
2.3GTK构件
GTK构件可以分为两种。
相关联的GdkWindow窗口和无关联的构件。
大部分构件属于第一种构件,并且可以显示在GdkWindow。
1.GtkWindow构件
GtkWidow构件是最大的容器,是一个窗体构件,只能容纳一个子构件,若要容纳更多的构件必须使用布局控件来布局。
相关的函数:
GtkWidget*gtk_window_new(GtkWindowTypetype);
Gtk_container_add(GTK_CONTAINER(window),widget);
2.组装构件
组装构件通常是直接从GtkContainer派生,这些构件通常有多个子构件,它们的作用是布局管理。
相关的函数:
GtkWidget*gtk_table_new(gintrows,gintcolumns,ginthomogeneous);
voidgtk_table_attach(GtkTable*table,GtkWidget*child,gintleft_attach,
gintright_attach,ginttop_attach,gintbottom_attach,
gintxoptions,gintyoptions,
gintxpadding,gintypadding);
3.按钮构件
GtkButton,按钮构件用于用户点击时执行某个动作。
相关函数:
GtkWidget*gtk_button_new();
GtkWidget*gtk_button_new_with_label(constgchar*label);
GtkWidget*gtk_button_new_with_mnemonic(constgchar*label);
4.文本构件
GtkText允许多行显示或编辑文本。
它支持多种颜色以及多种字体的文本,允许它们以任何需要的形式混合显示,还有许多与Emacs兼容的文本编辑命令。
文本构件支持完全的剪切/粘贴功能,以及双击选择一个单词和单击选择整行的功能。
相关函数:
Gtk_Widget*gtk_text_new(GtkAdjustment*hadj,GtkAdjustment*vadj);
voidgtk_text_set_editable(GtkText*text,ginteditable);
voidgtk_text_insert(GtkText*text,GdkFont*font,GdkColor*fore,GdkColor*back
constchar*chars,gintlength);
5.标签构件
GtkLabel是GTK中最常用的构件之一,没有相关联的X窗口,标签构件不能引发信号。
若需要引发构件,需将其放在一个事件盒构件中,或放在按钮构件中。
相关函数:
voidgtk_label_set_text(GtkLabel*label,char*str);
6.笔记本构件
GtkNotebook是相互重叠的页面集合,每一页都包含不同的信息,且一次只有一个页面是可见的。
该构件在GUI编程中很常用。
要说明大量的相关的信息,同时将它们分开显示,笔记本构件是一种很好的解决方案。
相关函数:
GtkWidget*gtk_notebook_new(void);
voidgtk_notebook_append_page(GtkNotebook*notebook,
GtkWidget*child,
GtkWidget*tab_label);
Voidgtk_notebook_prepend_page(GtkNotebook*notebook
GtkWidget*child,
GtkWidget*tab_label);
7.分栏列表构件
GtkCList是GtkList的替代品,它提供更多的特性。
分栏列表构件是多列列表构件,能处理多达数千行的信息。
每一列可以有一个标题,可以是活动的,也可以将函数绑定到列选择上。
相关函数:
GtkWidget*gtk_clist_new(gintcolumns);
GtkWidget*gtk_clist_new_with_titles(gintcolumns,gchar*titles[]);
创建列表后,用一下函数添加数据行:
gintgtk_clist_prepend(GtkCList*clist,gchar*text[]);
gintgtk_clist_append(GtkCList*clist,gchar*text[]);
用一下函数删除一些数据行:
voidgtk_clist_remove(GtkCList*clist,gintrow);
GtkCList从容器构件派生的,除了容器所具有的一些信号,还有一下附加信号:
select_row:
选中一行时引发,该信号传递信息,依次是GtkCList*clist、gintrow、gintcolumn、GtkEventButton*event.
unselect_row:
用户对一行取消选择,引发这个信号。
传递的次序与上个信号一样。
click_column:
选中某一列时引发,传递信息依次是:
GtkCList*clist、gintcolumn。
回调函数的形式如下:
voidselect_row_callback(GtkWidget*widget,gintrow,gintcolumn,
GdkEventButton*event,gpointerdata);
回调函数用下面的形式连接到信号:
gtk_signal_connect(GTK_OBJECT(clist),”select_row”,
GTK_SIGNAL_FUNC(select_row_callback),NULL);
3Linux系统调用
3.1Linux系统文件
Linux系统中一切皆是文件,输入输出设备也映射为设备文件,所以大多数输入输出都是通过文件读写来实现[4]。
这样屏蔽了底层的差异,从而提供了统一的操作接口。
Linux中常见的文件类型为:
普通文件、目录文件、字符设备文件、块设备文件、符号链接文件等[5]。
很多系统服务和应用服务的配置文件都是以普通文件的实行存在,这些文件很容易通过Linux的系统调用来配置和修改,或者是编写脚本实现相应的功能[6]。
3.2Linux中文件I/O
Linux中提供了两种读取文件的方法:
一种是通过C语言的标准库函数调用来完成;另一种是通过对Linux的系统调用来完成。
Linux系统中可用的文件I/O函数—打开文件、读文件、写文件等等。
大多数Linux文件I/O只需用到5个函数:
open、read、write、lseek、以及close。
Linux系统提供的函数常被称为不带缓存的I/O,不带缓存指的是每个read和write都调用内核中的一个系统调用。
对于内核而言,所有打开的文件都由文件描述符引用。
文件描述符是一个非负整数。
当打开或创建文件时,内核向进程返回一个文件描述符。
读写文件时,用open或creat返回的文件描述符标识该文件,并将其作为参数传送给read或write。
通常使文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符与标准出错输出相结合。
Linux系统调用相关的函数如下:
intopen(constchar*pathname,intoflag,…./*,mode_m*/);
其中第三个参数的数目和类型是可变的,在创建新文件时使用。
ssize_tnumread=read(intfd,void*buf,size_tqty);
ssize_tresut=write(intfd,void*buff,size_tqty);
intresult=close(intfd);
3.3Linux中进程和线程的使用
Linux系统中进程不同于其它系统,很多操作提供了产生进程的机制,在新的进程空间中创建进程,读取可执行文件。
但是Linux不同,它创建的子进程具有和父进程相同的数据、代码段。
父子进程间的区别就是进程的ID不同[7]。
pit_tresult=fork(void);
该函数返回两次函数值,向父进程返回子进程的pid,向子进程返回0。
在使用fork()函数创建进程后,需要父进程等待子进程的结束。
系统调用wait(&status)实现这一功能。
pid_tresult=wait(&status);
linux线程是指基于Linux操作系统下的多线程设计,包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。
Linux系统下的多线程遵循POSIX线程接口,称为pthread。
编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
Linux中线程被称为轻量级的进程,同属于一个进程的多个线程使用相同的资源,并且切换所需的空间和时间均远低于进程所需的代价。
创建线程的函数如下:
intpthread_create(pthread_t*thread,
pthread_attr_t*attr,
void*(*func)(void*),
void*arg);
4套接口编程
4.1简介
网络环境中实现计算机的进程之间通信,要用到socket编程,它是用Linux文件描述符和其它程序通信的方式。
Internet常用的有两种套接字类型,StreamSockets(流格式)和DatagramSockets(数据包格式)。
数据包套接字是无连接、不可靠的。
流式套接字是可靠的双向通讯的数据流,有错误控制[8]。
网络环境中传输数据时在传送端先将数据封装,在接收端进行逆操作,然后获取数据。
Linux中模型由应用层,传输层,IP层,数据链路层构成。
图4.1网络示意图
4.2socket编程相关的结构体
Socket编程需要用到特定的数据类型以及其它一些与Internet相关的数据结构,网络字节顺序和本机字节顺序的转换[9]。
socket文件描述符使用int类型描述。
数据传输时使用的是网络字节顺序,为保证系统的可移植性,应通过函数htons()将本机字节顺序转换为网络字节顺序。
其相关函数:
htons()---hosttonetworkshort
htonl()---hosttonetworklong
ntohs()---networktohostshort
ntohl()---networktohostlong
socket用到的第一个结构体是structsockaddr,为许多类型的套接字储存套接字地址信息:
structsockaddr{
unsignedshortsa_family;
charsa_data[14];
};
其中sa_family能够是各种各样的类型,常用的是AF_INET,sa_data包含套接字中的目标地址和端口信息[10]。
为了方便socket编程,与此并列的是另一个结构:
structstructaddr_in{
shortintsin_family;