




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 Linux下的C语言编程1、 实验内容(1) 编一个C程序,其内容为实现文件拷贝的功能;(2) 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。2、 源程序 题目一: #include#includevoid main(int argc,char *argv) int ch; if(argc!=3) printf(arguments error !n); exit(-1); if(freopen(argv1,r,stdin)=NULL) printf(cant open %sn,argv1); exit(-1); freopen(argv2,w,stdout); while(ch=getchar()!=EOF) putchar(ch); fclose(stdin); fclose(stdout);题目二:主程序Main.c:#include#include#include#includeint main(int argc,char *argv) pid_t p1,p2,p3; pid_t t1,t2,t3; int status; if(p1=fork()=0) execv(./hua,argv); else if(p2=fork()=0) execv(./shao,argv); else if(p3=fork()=0) execv(./tan,argv); else t1=waitpid(p1,&status,0); t2=waitpid(p2,&status,0); t3=waitpid(p3,&status,0); 进程tan.c: #include/* 一般可以在 /usr/include/gtk-2.0 下找到上边的头文件 * 上边的头文件的作用是包含进行GTK编程所有可能用到的头 * 文件,包括glib.h等 */voidcb_button(GtkWidget *widget, gpointer data)/ 按钮button的回调函数 gtk_main_quit();intmain(int argc, char *argv) GtkWidget *main_window; / GtkWidget 是绝大部分可视组件的的基类 gtk_init(&argc, &argv); /对程序传入的命令行参数进行标准化处理 main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /创建窗口(200x200大小) gtk_window_set_title(GTK_WINDOW(main_window), tan!); /设置窗口标题 gtk_widget_show(main_window); /显示窗口 g_signal_connect(G_OBJECT(main_window), destroy, G_CALLBACK(cb_button),NULL); gtk_main(); /Gtk程序主循环 return 0;进程shao.c: #includevoidcb_button(GtkWidget *widget, gpointer data)/ 按钮button的回调函数 gtk_main_quit();intmain(int argc, char *argv) GtkWidget *main_window; /主窗口对象 GtkWidget *button; /将要放置到主窗口中的按钮对象 gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(main_window), shao!); /设置窗口的默认大小(宽200,高度50) gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50); button = gtk_button_new_with_label(退出程序); gtk_container_add(GTK_CONTAINER(main_window), button); /为button连接“单击事件”要调用的回调函数 g_signal_connect(G_OBJECT(button), clicked, G_CALLBACK(cb_button),NULL); gtk_widget_show(button); gtk_widget_show(main_window); /上边的两句可以合为 gtk_widget_show_all(window) g_signal_connect(G_OBJECT(main_window),destroy,G_CALLBACK(cb_button),NULL); gtk_main(); return 0;进程hua.c: #include/按钮“button”的回调函数voidcb_button(GtkWidget *widget, gpointer data)/cb = call back g_print(你单击了按钮n); gtk_main_quit();intmain(int argc, char *argv) GtkWidget *main_window; /主窗口对象 GtkWidget *hbox, *button, *editor; gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(main_window), destroy, G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_title(GTK_WINDOW(main_window), hua!); gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50); button = gtk_button_new_with_label(退出程序); g_signal_connect(G_OBJECT(button), clicked, G_CALLBACK(cb_button),NULL); editor = gtk_entry_new(); hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), editor, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10); gtk_container_add(GTK_CONTAINER(main_window), hbox); gtk_widget_show_all(main_window); gtk_main(); return 0;三、调试过程 题目一: 这个程序比较简单,源程序编写好后进入终端,使用命令cd /media/hda7/tsh/拷贝文件进入程序所在的目录,再使用编译命令gcc copy.c -o copy 将程序编译成可执行文件,这样在该目录下会生成一个名为copy的可执行文件,运行该文件./copy tan shao,将名为tan的文件复制到shao 中。 这样第一个程序就完成了。题目二: 这个程序使用到了GTK编程,所在在编译时要用一以GTK的编译命令,首先分别把三个子程序编译成可执行文件,与上面的调试一样,先是进入文件目录,稍有不同的是编译命令, gcc -Wall -g tan.c -o tan pkg-config -cflags -libs gtk+-2.0,使用该命令就能把子程序tan.c 编译成可执行文件。同样依次将另外两个编译好后,编译主程序,gcc main.c -o main,最后执行main就能得到要的三个窗口。 实验二 系统调用的实现 一、实验内容 通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。 实现的功能是:文件拷贝。二、源程序: 写入到新内核kernel/sys.c中的程序: asmlinkage int sys_filecopy(char* sourceFile,char* distFile) int f1,f2,n; char buf512; mm_segment_t fs; if(f1=sys_open(sourceFile,O_RDONLY,0) =-1) printk(Cant open %sn,sourceFile); sys_exit(-1); if(f2=sys_open(distFile,O_CREAT|O_WRONLY|O_TRUNC,0666)=-1) printk(Cant creat %s,mode %on,distFile,0666); sys_exit(-1); fs=get_fs(); set_fs(get_ds(); while(n=sys_read(f1,buf,512)0) if(sys_write(f2,buf,n)!=n) printk(write error on file %s,distFile); sys_exit(-1); set_fs(fs); sys_close(f1); sys_close(f2); return 0; 测试用的程序: #include #include#include#define _NR_filecopy 320 int main(int argc,char *argv) int i; if(argc !=3) printf(error!); else i=syscall(320,argv1,argv2); printf(ok!); return 0;三、调试过程: 首先,在sys.c中添加系统调用代码,即上面源程序中的第一个程序. 然后在unistd.h中,给你的系统调用分配一个唯一的号码. #define _NR_filecopy 320 最后在syscall_table.S中,添加用来对sys_call_table数组进行的初始化.添加: .long sys_filecopy /* 320 */ 这样,文件的修改就完毕了。 接下来是编译内核。首先是配置内核,拷贝已存的配置文件.config到新内核中,然后运行make menuconfig,进入内核配置菜单,移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件(包含了当前工作内核的配置)做为配置文件: 然后浏览内核配置菜单, 选择你需要的功能. 完成配置后, 选择Exit. 执行下面命令来构建内核:make-kpkg cleanfakeroot make-kpkg -initrd -append-to-version=-custom kernel_image kernel_headers等待内核编译完后,安装新内核,在/meida/disk目录下会有两个./deb软件包,安装这两个软件包,安装完后就可以重启系统了,再次进入系统就可以进入新内核中运作。 最后编译测试程序,gcc test.c -o test,然后运行测试程序就完成了任务。 实验三 增加设备驱动程序一、实验内容 通过模块方法,增加一个新的设备驱动程序,其功能以简单,实现字符设备的驱动。二、源程序编写代码tanshaohua.c:#include#include#include#include#include#includeint tsh_major=0;/* 用来保存申请到的主设备号 */MODULE_LICENSE(GPL);char *buffer=tsh;static int tsh_open(struct inode *inode,struct file *file) printk(open filen); return 0; static ssize_t tsh_read(struct file *file,char _user *buf,size_t count,loff_t *pos) int tsh; tsh=copy_to_user(buf,buffer,count); return 1; static ssize_t tsh_write(struct file *file,const char *buf,size_t count,loff_t *pos) int tsh; tsh=copy_from_user(buffer,buf,count); return 1; static int tsh_release(struct inode *inode,struct file *file) printk(close filen); return 0;struct file_operations tsh_fops = /* 申请主设备号时用的结构*/ .open = tsh_open, .read = tsh_read, .write = tsh_write, .release = tsh_release, ;int tsh_init(void) tsh_major=register_chrdev(0,tanshaohua,&tsh_fops); if(tsh_major0) return tsh_major; printk(KERN_ALERTmy major number is:%dn,tsh_major); return 0; void tsh_cleanup(void) unregister_chrdev(tsh_major,tanshaohua); printk(KERN_ALERTmy device file has been removedn); module_init(tsh_init);module_exit(tsh_cleanup);makefile文件内容: obj-m:=tanshaohua.oKERNELBUILD:=/lib/modules/uname -r/builddefault:make -C$(KERNELBUILD) M=$(shell pwd) modules测试程序: test.c: #include#includeint main(void) char buf32; int fd; printf( please input:n); scanf(%s,buf); fd=open(/dev/tanshaohua,O_RDWR); read(fd,buf,32); printf(the content readed from tsh is:%sn,buf); return 1; test1.c: #include#includeint main(void) char buf32; int fd; printf( please input:n); scanf(%s,buf); fd=open(/dev/tanshaohua,O_RDWR); write(fd,buf,32); read(fd,buf,32); printf(the content readed from tsh is:%sn,buf); return 1; 三、调试过程: 首先编写代码tanshaohua.c,然后编写makefile文件,与tanshaohua.c放在同一个目录里,接着编译模块sudo make.这时,在tanshoahua.c所在文件夹里就会有tanshoahua.ko。 插入模块, insmod ./tanshaohua.ko,用dmesg查看内核信息,创建设备文件,mknod /dev/tanshaohua c 253 0,然后就可以执行测试程序. 任务完成,最后删除模块, rmmod ./tanshaohua 实验四 图形界面实现系统监控一、实验内容 了解和掌握/proc文件系统的特点和使用方法,用图形界面实现系统监控状态,显示系统中若干部件使用情况。二、源程序 #include #include #include#include#include#include#include #include #include #include#include #include #includestatic GtkWidget *clocker;/*存放时间*/static GdkPixmap *pixmap = NULL;/*存放CPU使用曲线图*/GdkGC *my_gc_red;GdkColor color;long user2=0,system2=0,nice2=0,idle2=0,iowait2=0,irq2=0,softirq2=0; /*全局变量,用来存放获取的CPU使用信息*/enum /*进程树表信息*/ col_name = 0, col_stat, col_pid, col_ppid, col_nice, col_mem, n_cols1;voidon_new_item_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_open_item_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_t_1_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_c_1_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_p_1_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_d_1_activate (GtkMenuItem *menuitem, gpointer user_data)voidon_about1_activate (GtkMenuItem *menuitem, gpointer user_data)void on_reboot_item_activate(GtkMenuItem *menuitem, gpointer user_data) /*重启*/ system(reboot); void on_shutdown_item_activate(GtkMenuItem *menuitem, gpointer user_data) /*关机*/ system(halt);struct Process /*存放进程信息*/ char pid5; char comm20; char state20; char mem20; char ppid20; char nice20; pro200;float mm=0,shao=0;float util=0;void model_data_new1(GtkTreeModel* store1, const gchar* name, const gchar* stat, const gchar *pid,const gchar *ppid,const gchar *nice, const gchar *mem) /*建立树表数据*/ GtkTreeIter iter; gtk_list_store_append(GTK_LIST_STORE(store1), &iter); gtk_list_store_set(GTK_LIST_STORE(store1), &iter, col_name, name, col_stat, stat, col_pid, pid, col_ppid,ppid, col_nice,nice, col_mem, mem, -1);GtkTreeModel* create_model1() /*创建树表*/ GtkListStore *store1; store1 = gtk_list_store_new (n_cols1,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING); return GTK_TREE_MODEL(store1);void arrange_tree_view1(GtkWidget* view) GtkCellRenderer* renderer; renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, 进程名t, renderer, text, col_name, NULL); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, 状态t, renderer, text, col_stat, NULL); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, pidt, renderer, text, col_pid, NULL); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, ppidt, renderer, text, col_ppid, NULL); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, nicet, renderer, text, col_nice, NULL); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, 内存t, renderer, text, col_mem, NULL); int select_name(char name) /*查找文件名*/ int i; for(i=0;namei!=0;i+) if(isalpha(namei)|namei=.) return 0; return 1; int show_pro_info(void) /*显示进程信息函数*/ DIR *dir; struct dirent *ptr; int fd,tt; int i=0; int j; int total=0; char path_statm50; char path_status50; char path_stat50; char buffer100; char buf100; dir=opendir(/proc); while(ptr=readdir(dir)!=NULL) if(select_name(ptr-d_name) strcpy(proi.pid,ptr-d_name); i+; total+; closedir(dir); for(i=0;itotal;i+) strcpy(path_statm,/proc/); strcpy(path_status,/proc/); strcat(path_statm,proi.pid); strcat(path_statm,/statm); strcat(path_status,proi.pid); strcat(path_status,/status); strcpy(path_stat,/proc/); strcat(path_stat,proi.pid); strcat(path_stat,/stat); fd=open(path_status,O_RDONLY); tt=read(fd,buffer,100); strtok(buffer,:); strcpy(m,strtok(NULL,n); strtok(NULL,:); strcpy(proi.state,strtok(NULL,n); strtok(NULL,:); strtok(NULL,n); strtok(NULL,:); strtok(NULL,n); strtok(NULL,:); strtok(NULL,n); strtok(NULL,:); strcpy(proi.ppid,strtok(NULL,n); close(fd); fd=open(path_statm,O_RDONLY); tt=read(fd,buf,100); strcpy(proi.mem,strtok(buf, ); strcat(proi.mem,kb); close(fd); fd=open(path_stat,O_RDONLY); tt=read(fd,buf,100); strtok(buf, ); for(j=0;j17;j+) strtok(NULL, ); strcpy(proi.nice,strtok(NULL, ); close(fd); return total; gint show_proc(GtkWidget *treeview1) /*将进程信息插入树表中*/ int i,num; GtkTreeModel *store = create_model1(); gtk_tree_view_set_model ( GTK_TREE_VIEW(treeview1), store); num=show_pro_info(); /*if(num) gtk_list_store_clear(GTK_LIST_STORE(store);*/ for(i=0;itm_hour,l_time-tm_min,l_time-tm_sec); strcat(buf,n系统开启时间:); fd=open(/proc/uptime,O_RDONLY); read(fd,buf1,100); time_run=atoi(strtok(buf1,.); time(&timep); timep-=time_run; strcat(buf,ctime(&timep); strcat(buf,系统运行时间:); fd=open(/proc/uptime,O_RDONLY); read(fd,buf1,100); time_run=atoi(strtok(buf1,.); hour=time_run/3600; minute=(time_run-hour*3600)/60; second=time_run%60; sprintf(buf1,%d:%d:%d,hour,minute,second); strcat(buf,buf1); gtk_label_set_text(GTK_LABEL(clocker),buf); free(buf); free(buf1); return 1;void show_sys_info(GtkWidget * text) /*读取主机名和系统版本号*/ int fd0; int fd1; int fd2; char *buf,*buf1; buf=(char *)malloc(2000*sizeof(char); buf1=(char *)malloc(2000*sizeof(char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东省中医院贵州医院第十三届贵州人才博览会引才考前自测高频考点模拟试题及答案详解1套
- 2025河北承德市滦平县招聘社区工作者22人模拟试卷及答案详解1套
- 2025广东深圳市龙岗区第五人民医院第二批招聘14人考前自测高频考点模拟试题有答案详解
- 2025合肥市口腔医院招聘工作人员81人考前自测高频考点模拟试题及答案详解1套
- 2025江苏盐城市急救医疗中心招录政府购买服务用工1人考前自测高频考点模拟试题及参考答案详解1套
- 2025重庆九洲智造科技有限公司招聘项目经理等岗位测试笔试历年参考题库附带答案详解
- 2025贵州遵义市诚达投资开发有限责任公司招聘笔试历年参考题库附带答案详解
- 2025贵州贵阳国家高新区选聘国有企业领导人员总及考察笔试历年参考题库附带答案详解
- 2025萍乡市健志供应链管理有限公司招聘经理1人笔试历年参考题库附带答案详解
- 2025福建龙岩国信物业有限公司招聘5人笔试历年参考题库附带答案详解
- 2024版2025秋贵州黔教版综合实践活动五年级上册全册教案教学设计
- 转作风重实干课件
- 甲状腺课件类型
- 单招备考科学方案
- 2025年秋新人教版数学三年级上册全册教学课件
- 《工程勘察设计收费标准》(2002年修订本)
- 山东省青岛第三十九中学2023-2024学年九年级上学期月考数学试卷(10月份) (月考)
- HR如何筹划年终奖?(10大经典个税筹划案例)汇编
- GB/T 43063-2023集成电路CMOS图像传感器测试方法
- 作文格子纸-word版本
- GB/T 18103-2022实木复合地板
评论
0/150
提交评论