版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1 课程设计目的12 环境搭建13 设计过程23.1 设计一:掌握Linux操作系统的使用方法23.1.1 内容要求23.1.2 设计过程及实现23.2 设计二:掌握系统调用的实现过程63.2.1内容要求6设计过程及实现63.3 设计三:掌握增加设备驱动程序的方法11内容要求113.3.2设计过程及实现113.4 设计四:使用GTK/QT实现系统监控器15内容要求15设计过程及实现154 课设小结23附 代码241.1241.224228329431课程设计报告题目: 操作系统课程设计报告课程名称: 操作系统原理专业班级: IS1302学 号: U201315130姓 名: 王超指导教师:
2、阳富民 报告日期:计算机科学与技术学院1 课程设计目的(1)掌握Linux操作系统的使用方法;(2)了解Linux系统内核代码结构;(3)掌握实例操作系统的实现方法。2 环境搭建 (1)在Windows10上,利用虚拟机软件VMware软件搭建的Linux平台:Ubuntu 14.04.2 LTS内核:Linux系统详情如图2.1所示图 2.1(2)在添加系统调用中用到的其他内核包:下载和当前实验环境最为接近的系统版本(这点很重要)使用apt-get install linux-source-3.0.0 命令,下载.bz2 解压命令:tar xjvf .bz2 C /usr/src解压后,在/
3、usr/src目录下得到内核文件夹(3)在调用linux图形库时需要安装GTK环境:安装gcc/g+/gdb/make 等基本编程工具apt-get install build-essential Tip:如果提示由于依赖项不能安装,需要使用apt的强化版aptitude,这个工具可以自动分析软件包依赖,系统一般不自带,需要先安装,具体过程是:apt-get install aptitudeaptitude install build-essentialaptitude这个工具很强大,对于解决软件包安装时的依赖问题很有帮助。安装 libgtk2.0-dev libglib2.0-dev 等开发
4、相关的库文件:apt-get install gnome-core-devel安装GTK核心组件: apt-get install libgtk2.0-dev3 设计过程3.1 设计一:掌握Linux操作系统的使用方法3.1.1 内容要求(1)编一个C程序,其内容为实现文件拷贝的功能;(2)编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。 (gtk/Qt)3.1.2 设计过程及实现(1)文件拷贝:文件的拷贝主要的思想就是利用文件指针操作,在两个文件之间进行按字符的fget和fput。从而完成整个文件的拷贝操作。在这个基本功能之外,需要增加程序的健壮性,
5、具体有以下几个方面:源文件是否存在且能读取数据;是否能创建目的文件,且能向里面写入数据;程序需要的argc参数个数是否满足要求;基于以上几点和内容要求,主要的程序段如下:if(argc!=3)/判断参数个数是否为3 ,否则返回printf(Error in argc!n);return 0;if( (fsource=fopen(argv1,rb)=NULL )printf(Error in open source file!n);/判断源文件是否能打开和读出return 0;if( (ftarget=fopen(argv2,wb)=NULL )printf(Error in open targ
6、et file!n);/判断目的文件时候能创建和写入return 0;while(c=fgetc(fsource)!=EOF)fputc(c,ftarget);/按字符读取和写入数据实验过程将source/source.txt文件拷贝到到target.txt,开始时如下图3.1.1所示:图 3.1.1 复制开始前source/source.txt文件内容利用mycopy程序复制,查看target.txt文件复制结果如下图3.1.2所示:图3.1.2 复制后target.txt文件的具体内容(2)实现三个进程之间的并发程序:这里需要用到课程实验时的fork( )程序以及GTK的图形显示。基本fo
7、rk()程序,调用显示一个父进程和两个子进程的结构如下: if(pid_1=fork()=0) printf(Child 1# is running.n);/第一个子进程 Child 1#show(argc,argv,This is Child 1#);/调用函数显示窗口 else if(pid_2=fork()=0)printf(Child 2# is running.n);/第二个子进程 Child 2#show(argc,argv,This is Child 2#);/调用函数显示窗口elseprintf(Parent # is running.n);/父进程 Parent #/由于父进
8、程需要显示全部子进程PID,所以这里直接用参数画窗口 调用GTK显示窗体函数模块的结构:void show(int argc,char *argv ,char *title ) gtk_init (&argc, &argv); /初始化工具包并且获取命令行参数; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /创建新的窗口;/设定窗口的位置; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);/监听窗口的destroy事件;g_signal_connect (G_OBJ
9、ECT (window), destroy, G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title);/用来设定更改窗口标题; gtk_container_set_border_width (GTK_CONTAINER (window), 20);/设定宽度;/使用gtk_vbox_new函数建立纵向组装盒;/为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内; vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_bo
10、rder_width (GTK_CONTAINER (vbox), 100);/设定宽度; gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox);/使用gtk_box_pack_start函数将构件放到组装盒中; sprintf (id_char, %s ,My ID:%d, title,getpid ();/显示PID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1
11、0); gtk_widget_show (label); sprintf (id_char, 父进程ID:%d, getppid ();/显示PPID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); button = gtk_button_new_with_label (close);/关闭窗口按钮/信号登记函数,监听按钮的clicked事件。/当窗口clicked时, gtk_widget_destr
12、oy 就会被调用。/而 gtk_widget_destroy 函数又调用 gtk_main_quit() 结束程序运行。 g_signal_connect_swapped (G_OBJECT (button), clicked, G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 10); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button)
13、;/函数显示窗口中的组件 gtk_widget_show (button); gtk_widget_show (window);/准备将窗口和所有的组件显示在屏幕上,函数必须在GTK程序的最后调用. gtk_main (); 编译代码forkgtk.c,运行;编译命令为:gcc -o forkgtk forkgtk.c pkg-config -cflags -libs gtk+-2.0程序运行结果如下图3.3所示:图 3.2 三个并行显示的窗口3.2 设计二:掌握系统调用的实现过程3.2.1内容要求(1)采用编译内核的方法,添加一个新的系统调用。(2)编写一个应用程序,测试新添加的系统调用。(
14、3)系统调用的功能:文件拷贝。设计过程及实现linux内核版本的不同,linux2.X和linux3.X直接添加系统调用和重新编译内核的方法有差异,甚至linux2.X之间,内核文件也有变化。(1)修改Makefile文件,修改系统版本后缀:如下图所示:这里加的是本人的姓名的首字母,以示区分。图修改Makefile文件版本(2)修改目录下的sys.c文件,在最后加入新的系统调用,拷贝函数实现。如下所示:asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) const int BUF_SIZE = 512;
15、int fin,fout; char bufBUF_SIZE; int copy_count; mm_segment_t fs; /段操作的初始化 fs = get_fs(); set_fs(get_ds();/* 系统调用打开源文件,若失败,返回-1 */ if (fin = sys_open(s_file,O_RDONLY,S_IRUSR) = -1) return -1;printk(Error in oen source file!); /* 系统调用创建并打开目标文件,若失败,返回-2 */ if (fout = sys_open(t_file,O_RDWR | O_CREAT |
16、O_TRUNC,S_IRUSR | S_IWUSR) = -1) return -2;printk(Errod in open target file!); while(copy_count=sys_read(fin,buf,BUF_SIZE) /* 拷贝文件,若失败,返回-3 */ if (copy_count = -1 | sys_write(fout,buf,copy_count) = -1) return -3;printk(Error in copy file!); set_fs(fs); /* 段操作结束 */ return 0; (3)修改/usr/src/ linux-sour
17、ce-3.18.27/arch/x86/syscalls文件夹下面头文件:syscall_64.tbl,在文件的系统调用号部分添加一个新的系统调用,具体添加行如下:323 64 hdcopyfile sys_hdcopyfile同时把最下面的总调用号加1,变成323。具体截图如下图所示。图 添加系统调用号(4)添加声明到头文件具体实现如下图所示:图 填写系统调用入口表当用户程序需要系统提供服务的时候,比如347号调用sys_zcycopyfile,就会通过系统调用产生一个int 0x80的软中断,就会进入到系统调用的入口函数,找到这个调用函数表查找入口函数,也就是这里的.long sys_zc
18、ycopyfile,进而在sys.c中找到具体的函数实现asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) ,从而实现系统调用。(5)配置内核:(先cd到下载的新的内核包)净化解压后的源代码make mrproper安装ncurses环境:apt-get install libncurses5-devncurses是一个能提供基于文本终端窗口功能的动态库, 提供字符终端处理库,包括面板和菜单。对内核选项进行配置make menuconfig执行命令之后,会弹出一个框,提示对内核裁剪或配置。这次用不到变化内
19、核模块,直接用键盘方向键选项就行了。建立模块间的依赖信息make dep这一步正常情况会提示用户多此一举删除配置时留下的一些不用的文件make clean这一步一般没动作,除非是失败后再次编译内核时要用到。(6)编译内核:编译内核文件bzImage:make bzImage j9这一步耗费的时间比较长,所以加了一个-j9,这种方法使用多线程编程,实际使用时发现能很大的提高效率。(这个视CPU而定,要看CPU最多支持几个线程)编译内核模块:make modules j9 (7)安装内核经过最麻烦的编译内核,接下来的安装内核就显得容易多了,输入命令sudo make modules_install
20、 安装内核模块sudo make install 安装内核同样,如果嫌时间太慢的话,同样可以在最后加上 j9 (8)环境修改:具体如下:复制内核到boot目录:cp arch/i386/boot/bzImage /boot/vmlinuz-3.0.69.zcy 可利用Tab快速补全路径和文件,这样方便又不容易出错。建立要载入ramdisk的映像文件更新启动项文件grub2.conf,直接输入命令update-grub2就行。(9)最后需要修改/boot/grub/ 目录下 grub.cfg文件;进入文件之后,按Ctrl+F 查找 timeout ,将所有的timeout数值改为100;这个数值
21、的单位是秒,这么做的目的是修改启动项的暂停时间,以便让用户有足够的时间选择要进入的操作系统。(10)重启,进入新系统:启动项如下图所示:图 系统启动项(11) 进入新系统之后,输入命令uname a / -r查看系统新版本:执行情况如下图所示。可知已经成功的进入到修改后的新内核。图显示新内核信息(12)编写测试程序zcopy.c:(13)编译运行,生成执行文件。然后看执行程序是否可以实现文件的拷贝,执行结果如下图和图所示,可看到已经成功的实现了预计的功能。图 执行程序图程序执行显示结果3.3 设计三:掌握增加设备驱动程序的方法内容要求(1)采用模块方法,添加一个新的设备驱动程序。(2)要求添加
22、字符设备的驱动。(3)编写一个应用程序,测试添加的驱动程序设计过程及实现(1)Linux内核中的设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样对此设备文件进行操作。Linux支持3种设备:字符设备、块设备和网络设备。设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到
23、的那个设备。 一个典型的驱动程序,大体上可以分为这么几个部分: 注册设备:在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主设备号; 定义功能函数:对于每一个驱动函数来说,都有一些和此设备密切相关的功能函数。以最常用的块设备或者字符设备来说,都存在着诸如 open()、read()这一类的操作。当系统调用这些调用时,将自动的使用驱动函数中特定的模块。来实现具体的操作;卸载设备:在不用这个设备时,可以将它卸载,主要是从/proc 中取消这个设备的特殊文件。 (2)编写Makefile文件如下:ifneq ($(KERNELRELEASE),) obj-m := zcyd
24、river.o /obj-m表示编译连接后将生成zcydriver.o模块elsePWD :=$(shell pwd)/PWD为当前目录KVER :=$(shell uname -r)/KVER为当前系统内核版本KDIR :=/lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)/调用内核模块编译clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions#$(MAKE) -C $(KDIR) M=$(PWD) cleanendif调用Mak
25、efile文件之后,其具体过程如下:KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容;如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,内核的build程序Kbuild也被启动去解析kbuild语法的
26、语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。(3)编写设备功能函数:(zcydriver.c)函数框架如下所示:#define MY_MAJOR 240/定义设备号int zcydriver_open(struct inode *inode, struct file *filp)/打开设备ssize_t zcydriver_read(struct file *filp, char _user *buf, size_t count, loff_t *f_pos )/读数据sprintf(s2,%s
27、,s1);if(count12) if(!copy_to_user(buf,s2,count)return 0;elseif(!copy_to_user(buf,s2,strlen(s2)return 0;return -1;ssize_t zcydriver_write(struct file *filp, char _user *buf, size_t count, loff_t *f_pos)/写数据 if (count 0)return -EINVAL; if (s1 = NULL)return -ENOMEM; if (copy_from_user(s1, buf, count+1)
28、return -EFAULT; return count;int zcydriver_release(struct inode *inode, struct file *filp)/释放设备struct file_operations zcydriver_fops = / .owner = THIS_MODULE, .open = zcydriver_open, .read = zcydriver_read, .write = zcydriver_write, .release = zcydriver_release,;static int zcydriver_init(void)/设备初始化
29、 rc = register_chrdev(MY_MAJOR, zcydriver, &zcydriver_fops);/注册if(rc 0) printk(.register %s dev errorn, zcydriver); /失败返回错误 return -1; printk(.register zcydriver dev OKn);/成功注册设备 return 0;static void zcydriver_exit(void) unregister_chrdev(MY_MAJOR, zcydriver);/注销设备 printk(.Good Bye!n);MODULE_LICENSE
30、(GPL);module_init(zcydriver_init);module_exit(zcydriver_exit);(4)设备加载,安装过程如下:进入Makefile文件和zcydriver.c文件所在目录,清除make产生的残留文件。命令为:make clean 删除先前可能加载过的模块,命令为:rmmod /dev/zcydriver卸载设备:rm /dev/zcydriver编译设备文件,产生模块文件make加载模块insmod zcydriver.ko加载设备,分配设别号mknod /dev/zcydriver c 240 0更改用户对设备的操作权限为可读、可写chmod 66
31、6 /dev/zcydriver(5)运行测试程序,检验设备是否可读写:检测程序见报告附录的源代码,测试过程如下图所示:图设备测试结果3.4 设计四:使用GTK/QT实现系统监控器内容要求(1)了解/proc文件的特点和使用方法。(2)监控系统状态,显示系统中若干部件的使用情况。(3)用图形界面显示系统监控状态。设计过程及实现(1)/proc 文件特点:Linux的proc文件系统是进程文件系统和内核文件系统的组成的复合体,是将内核数据对象化为文件形式进行存取的一种内存文件系统,是监控内核的一种用户接口。它拥有一些特殊的文件(纯文本),从中可以获取系统状态信息。 /proc/cpuinfo保存
32、CPU信息,包括名称、型号、数目、主频、Cache等;/proc/version保存操作系统信息,包括系统版本、内核型号、GCC版本等; /proc/stat保存CPU活动信息数据,用来测算CPU使用率;/proc/meminfo保存内存空间和交换空间实时大小,可用来计算内存和交换分区使用率,MemTotal表示内存空间总大小,MemFree表示内存剩余空间大小,SwapTotal表示交换分区总大小,SwapFree表示交换分区剩余空间大小。据此可以算出内存和交换分区的使用率。(2)设计实现系统监控器ManagerCat 结构如下图所示:图监控器结构 系统信息页运行效果如下图所示:图系统信息页
33、效果 核心代码结构如下: vbox = gtk_vbox_new(FALSE,0);/新建容器 frame = gtk_frame_new (bufferf1);/新建标签页 label = gtk_label_new (bufferf1);/新建文本框,其余两个类似 gtk_container_add (GTK_CONTAINER (frame), label);/之后填入相应的值gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 进程信息页:运行效果如下图所示:图系统信息页效果 核心代码结构如下: sprintf
34、(bufferl, 进程信息); hbox=gtk_hbox_new(FALSE, 5); scrolled_window = gtk_scrolled_window_new (NULL, NULL);/滚屏 gtk_widget_set_size_request (scrolled_window, 300, 300); clist=gtk_clist_new(5);/5 lists get_proc_info(clist,&p,&q,&r,&s);/得到进程信息gtk_signal_connect(GTK_OBJECT(clist),select_row,GTK_SIGNAL_FUNC(se
35、lect_row_callback),NULL);/回调函数,响应行选择 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),clist); /滚屏 vbox=gtk_vbox_new(FALSE, 5); frame = gtk_frame_new (bufferl); gtk_widget_set_size_request (frame, 100, 215); label = gtk_label_new (bufferf1); gtk_container_add (GTK_CONTAINE
36、R (frame), label); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 10); button1 = gtk_button_new_with_label(结束进程); g_signal_connect (G_OBJECT (button1), clicked,G_CALLBACK (kill_proc), 结束进程);/杀死进程回调函数 gtk_box_pack_start(GTK_BOX(vbox), button1, FALSE, FALSE, 10); button2 = gtk_button_new_with_
37、label(刷新); g_signal_connect_swapped (G_OBJECT (button2), clicked,G_CALLBACK (refresh), clist); /按钮回调,刷新屏幕 gtk_box_pack_start(GTK_BOX(vbox), button2, FALSE, FALSE, 10); gtk_widget_show_all(hbox);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), hbox, label); 模块信息页:运行效果如下图所示:图3.4.4 模块信息页效果 核心代码结构如下:
38、sprintf(bufferl, 模块信息); vbox = gtk_vbox_new(FALSE,0); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (scrolled_window, 500, 250); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); clist2=gtk_clist_ne
39、w(3);/滚屏和列 get_module_info(clist2);gtk_signal_connect(GTK_OBJECT(clist2),select_row,GTK_SIGNAL_FUNC(select_row_callback2),NULL);gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),clist2); gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 5);hbox=gtk_hbox_new(FA
40、LSE, 0);button3 = gtk_button_new_with_label(刷新);/刷新按钮g_signal_connect_swapped (G_OBJECT (button3), clicked,G_CALLBACK (refresh2), clist2);gtk_widget_show_all(vbox);label = gtk_label_new (bufferl);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 内存信息页:运行效果如下图所示:图内存信息页效果核心代码结构如下: capab
41、ility = gtk_vbox_new(FALSE,0);/内存资源 gtk_container_set_border_width(GTK_CONTAINER(capability),5); gtk_widget_set_size_request(capability,200,320); gtk_widget_show(capability); label = gtk_label_new( 内存资源 ); gtk_notebook_append_page(GTK_NOTEBOOK(notebook),capability,label);gtk_notebook_set_current_pag
42、e(GTK_NOTEBOOK(notebook),3);/*把此页设为缺省显示页*/ cpu_hbox = gtk_hbox_new(FALSE,0);/cpu横向box gtk_box_pack_start(GTK_BOX(capability),cpu_hbox,TRUE,TRUE,2); gtk_widget_show(cpu_hbox); mem_hbox = gtk_hbox_new(FALSE,0);/mem横向box gtk_box_pack_start(GTK_BOX(capability),mem_hbox,TRUE,TRUE,2); gtk_widget_show(mem_
43、hbox); cpu_record = gtk_frame_new(cpu使用记录);/cpu使用记录窗口 gtk_container_set_border_width(GTK_CONTAINER(cpu_record),5); gtk_widget_set_size_request(cpu_record,1000,130); gtk_widget_show(cpu_record); gtk_box_pack_start(GTK_BOX(cpu_hbox),cpu_record,TRUE,TRUE,2); cpu_record_drawing_area = gtk_drawing_area_n
44、ew (); gtk_widget_set_size_request (cpu_record_drawing_area, 50,50);g_signal_connect (G_OBJECT(cpu_record_drawing_area), expose_event,G_CALLBACK(cpu_record_callback),NULL);gtk_container_add (GTK_CONTAINER(cpu_record), cpu_record_drawing_area);gtk_widget_show (cpu_record_drawing_area);/内存使用记录窗口 mem_r
45、ecord = gtk_frame_new(内存使用记录); gtk_container_set_border_width(GTK_CONTAINER(mem_record),5); gtk_widget_set_size_request(mem_record,1000,130); gtk_widget_show(mem_record); gtk_widget_set_size_request (mem_record_drawing_area, 50,50); g_signal_connect (G_OBJECT(mem_record_drawing_area), expose_event,G
46、_CALLBACK(mem_record_callback),NULL);/回调 gtk_widget_show (mem_record_drawing_area);4 课设小结这次课设历时两个星期,时间非常长,课设内容也非常丰富。这次课设总体上来说难度是十分大的。虽然我们已经在课堂上学习过相关的知识,但是真正做起来还是有不少困难。在这过程中,我遇到了许多编程上的困难。通过上网浏览资料,请教同学,这些困难终于得以解决。比如说内核的安装,前前后后安装了两天才完成。安装过程中出现错误就得重新来过,一次编译三四个小时。通过这次课设,我加深了对操作系统课程的了解,增强了动手实践的能力。我深深的体会到纸
47、上得来终觉浅,绝知此事要躬行。遇到困难解决问题的过程锻炼了我在逆境中成长的心态。最后感谢同学和老师对我的帮助。附 代码1.1#include int main(int argc,char *argv) if(argc!=3) printf(Error in argc!n);return 0; FILE * fsource=NULL;/源文件指针 FILE * ftarget=NULL;/目的文件指针 if( (fsource=fopen(argv1,rb)=NULL ) printf(Error in open source file!n);return 0; if( (ftarget=fop
48、en(argv2,wb)=NULL ) printf(Error in open target filen);return 0; int c; while(c=fgetc(fsource)!=EOF) fputc(c,ftarget); fclose(fsource); fclose(ftarget); return 0; 1.2#include #include #include void destroy_progress( GtkWidget *widget) gtk_main_quit ();void show(int argc,char *argv,char *title ) char
49、 id_char50; GtkWidget *window;/定义一个窗口; GtkWidget *vbox; /定义一个组装盒; GtkWidget *button;/定义一个按钮; GtkWidget *label; /定义一个label; gtk_init (&argc, &argv); /初始化工具包并且获取命令行参数; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /创建一个新的窗口; gtk_window_set_resizable (GTK_WINDOW (window), TRUE); /修改窗体的伸缩属性; /设定窗口的位置;
50、gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /监听窗口的destroy事件; g_signal_connect (G_OBJECT (window), destroy, G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title);/用来设定或更改窗口的标题; gtk_container_set_border_width (GTK_CONTAINER (window), 20);/用来设定宽度;
51、/使用gtk_vbox_new函数建立纵向组装盒; /为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内; vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);/用来设定宽度; gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /使用gtk_box_pack_start函数将构件放到组装盒中; sprintf (id_char, %s ,My ID:%d, title,getpid (); label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); sprintf (id_char, 父进程ID:%d, getppid (); label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026春季学期国家开放大学专科《EXCEL在财务中的应用》一平台在线形考形考作业一至四试题及答案
- 2026年家族遗传性癌症早筛指南
- 2026年学生逆反心理辅导与沟通技巧
- 2026年高潜人才(继任者)盘点与培养项目实训
- 2026年特殊教育学校康复设备配置与使用规范
- 2026年苍术艾叶熏蒸家庭空气消毒
- 2026年单片机应用开发综合实训项目教程
- 2026年幼儿园司机校车安全行驶培训
- 上海立达学院《安装工程施工技术》2025-2026学年第一学期期末试卷(A卷)
- 2026年吞咽障碍患者出院康复指导与安全进食
- 2025年神农架林区公安局招聘辅警真题
- 24J113-1 内隔墙-轻质条板(一)
- 小学音乐中多元文化音乐元素的融合与创新教学课题报告教学研究课题报告
- 心脏再同步化治疗的精准医疗策略
- “十五五规划纲要”解读:托育服务解育儿忧
- 涉融资性贸易案件审判白皮书(2020-2024)-上海二中院
- (2026年)成人术后口渴症状评估与管理的专家共识课件
- 2026年中国口含烟行业发展展望及投资策略报告
- 2024年全国青少年航天创新大赛航天知识竞赛试题及答案
- 全国大学生化学实验竞赛试题及答案
- 教师相关法律知识培训课件
评论
0/150
提交评论