实验1Linux下的C语言编程Word格式.docx
- 文档编号:4364173
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:44
- 大小:281.71KB
实验1Linux下的C语言编程Word格式.docx
《实验1Linux下的C语言编程Word格式.docx》由会员分享,可在线阅读,更多相关《实验1Linux下的C语言编程Word格式.docx(44页珍藏版)》请在冰点文库上搜索。
}
题目二:
主程序:
sys/>
intmain(intargc,char*argv[]){
pid_tp1,p2,p3;
pid_tt1,t2,t3;
intstatus;
if((p1=fork())==0){
execv("
./hua"
argv);
elseif((p2=fork())==0){
./shao"
elseif((p3=fork())==0){
./tan"
else{
t1=waitpid(p1,&
status,0);
t2=waitpid(p2,&
t3=waitpid(p3,&
进程:
#include<
gtk/>
/*一般能够在/usr/include/下找到上边的头文件
*上边的头文件的作用是包括进行GTK编程所有可能用到的头
*文件,包括等
*/
void
cb_button(GtkWidget*widget,gpointerdata)
copytanshao,将名为tan的文件复制到shao中。
如此第一个程序就完成了。
那个程序利用到了GTK编程,所在在编译时要用一以GTK的编译命令,第一别离把三个子程序编译成可执行文件,与上面的调试一样,先是进入文件目录,稍有不同的是编译命令,gcc-Wall-g-otan`pkg-config--cflags--libsgtk+`,利用该命令就可以把子程序编译成可执行文件。
一样依次将另外两个编译好后,编译主程序,gcc-omain,最后执行main就可以取得要的三个窗口。
实验二系统挪用的实现
一、实验内容
通过编译内核方式,增加一个新的系统挪用。
另编写一个应用程序,挪用新增加的系统挪用。
实现的功能是:
文件拷贝。
二、源程序:
写入到新内核kernel/中的程序:
asmlinkageintsys_filecopy(char*sourceFile,char*distFile)
{
intf1,f2,n;
charbuf[512];
mm_segment_tfs;
if((f1=sys_open(sourceFile,O_RDONLY,0))==-1){
printk("
Can'
sourceFile);
sys_exit(-1);
if((f2=sys_open(distFile,O_CREAT|O_WRONLY|O_TRUNC,0666))==-1){
tcreat%s,mode%o\n"
distFile,0666);
fs=get_fs();
set_fs(get_ds());
while((n=sys_read(f1,buf,512))>
0)
{if(sys_write(f2,buf,n)!
=n){
writeerroronfile%s"
distFile);
set_fs(fs);
sys_close(f1);
sys_close(f2);
return0;
测试用的程序:
linux/>
#define__NR_filecopy320
intmain(intargc,char*argv[])
inti;
if(argc!
=3)
error!
"
else
i=syscall(320,argv[1],argv[2]);
ok!
三、调试进程:
第一,在中添加系统挪用代码,即上面源程序中的第一个程序.
然后在中,给你的系统挪用分派一个唯一的号码.
#define__NR_filecopy320
最后在中,添加用来对sys_call_table[]数组进行的初始化.添加:
.longsys_filecopy/*320*/
如此,文件的修改就完毕了。
接下来是编译内核。
第一是配置内核,拷贝已存的配置文件.config到新内核中,然后运行makemenuconfig,进入内核配置菜单,移动绿色光标到LoadanAlternateConfigurationFile行后选择.config文件(包括了当前工作内核的配置)做为配置文件:
然后阅读内核配置菜单,选择你需要的功能.完成配置后,选择Exit.
执行下面命令来构建内核:
make-kpkgclean
fakerootmake-kpkg--initrd--append-to-version=-customkernel_imagekernel_headers
等待内核编译完后,安装新内核,在/meida/disk目录下会有两个./deb软件包,安装这两个软件包,安装完后就可以够重启系统了,再次进入系统就可以够进入新内核中运作。
最后编译测试程序,gcc-otest,然后运行测试程序就完成了任务。
实验三增加设备驱动程序
一、实验内容
通过模块方式,增加一个新的设备驱动程序,其功能以简单,实现字符设备的驱动。
二、源程序
编写代码:
asm/>
inttsh_major=0;
/*用来保留申请到的主设备号*/
MODULE_LICENSE("
GPL"
char*buffer="
tsh"
;
staticinttsh_open(structinode*inode,structfile*file)
{printk("
openfile\n"
staticssize_ttsh_read(structfile*file,char__user*buf,size_tcount,loff_t*pos)
{inttsh;
tsh=copy_to_user(buf,buffer,count);
return1;
staticssize_ttsh_write(structfile*file,constchar*buf,size_tcount,loff_t*pos){
inttsh;
tsh=copy_from_user(buffer,buf,count);
staticinttsh_release(structinode*inode,structfile*file)
{
closefile\n"
structfile_operationstsh_fops={/*申请主设备号时用的结构*/
.open=tsh_open,
.read=tsh_read,
.write=tsh_write,
.release=tsh_release,
};
inttsh_init(void)
tsh_major=register_chrdev(0,"
tanshaohua"
&
tsh_fops);
if(tsh_major<
0)returntsh_major;
printk(KERN_ALERT"
mymajornumberis:
%d\n"
tsh_major);
voidtsh_cleanup(void)
unregister_chrdev(tsh_major,"
mydevicefilehasbeenremoved\n"
module_init(tsh_init);
module_exit(tsh_cleanup);
makefile文件内容:
obj-m:
=
KERNELBUILD:
=/lib/modules/`uname-r`/build
default:
make-C$(KERNELBUILD)M=$(shellpwd)modules
测试程序:
:
intmain(void){
charbuf[32];
intfd;
pleaseinput:
scanf("
%s"
buf);
fd=open("
/dev/tanshaohua"
O_RDWR);
read(fd,buf,32);
thecontentreadedfromtshis:
%s\n"
write(fd,buf,32);
第一编写代码,然后编写makefile文件,与放在同一个目录里,接着编译模块sudomake.这时,在所在文件夹里就会有。
插入模块,insmod./,用dmesg查看内核信息,创建设备文件,mknod/dev/tanshaohuac2530
,然后就可以执行测试程序.
任务完成,最后删除模块,rmmod./tanshaohua
实验四图形界面实现系统监控
了解和掌握/proc文件系统的特点和利用方式,用图形界面实现系统监控状态,显示系统中若干部件利用情形。
#include<
#include<
gdk/>
staticGtkWidget*clocker;
/*寄存时刻*/
staticGdkPixmap*pixmap=NULL;
/*寄存CPU利用曲线图*/
GdkGC*my_gc_red;
GdkColorcolor;
longuser2=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
};
on_new_item_activate(GtkMenuItem*menuitem,
gpointeruser_data)
on_open_item_activate(GtkMenuItem*menuitem,
on_t_1_activate(GtkMenuItem*menuitem,
on_c_1_activate(GtkMenuItem*menuitem,
on_p_1_activate(GtkMenuItem*menuitem,
on_d_1_activate(GtkMenuItem*menuitem,
on_about1_activate(GtkMenuItem*menuitem,
voidon_reboot_item_activate(GtkMenuItem*menuitem,gpointeruser_data)/*重启*/
system("
reboot"
voidon_shutdown_item_activate(GtkMenuItem*menuitem,gpointeruser_data)/*关机*/
halt"
structProcess{/*寄存进程信息*/
charpid[5];
charcomm[20];
charstate[20];
charmem[20];
charppid[20];
charnice[20];
}pro[200];
floatmm=0,shao=0;
floatutil=0;
voidmodel_data_new1(GtkTreeModel*store1,
constgchar*name,constgchar*stat,constgchar*pid,constgchar*ppid,constgchar*nice,constgchar*mem){/*成立树表数据*/
GtkTreeIteriter;
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);
returnGTK_TREE_MODEL(store1);
voidarrange_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);
状态\t"
col_stat,NULL);
pid\t"
col_pid,NULL);
ppid\t"
col_ppid,NULL);
nice\t"
col_nice,NULL);
内存\t"
col_mem,NULL);
}
intselect_name(charname[])/*查找文件名*/
{inti;
for(i=0;
name[i]!
=0;
i++)
if(isalpha(name[i])||name[i]=='
.'
)
}
intshow_pro_info(void){/*显示进程信息函数*/
DIR*dir;
structdirent*ptr;
intfd,tt;
inti=0;
intj;
inttotal=0;
charpath_statm[50];
charpath_status[50];
charpath_stat[50];
charbuffer[100];
charbuf[100];
dir=opendir("
/proc"
while((ptr=readdir(dir))!
=NULL){
if(select_name(ptr->
d_name)){
strcpy(pro[i].pid,ptr->
d_name);
i++;
total++;
closedir(dir);
i<
total;
i++){
strcpy(path_statm,"
/proc/"
strcpy(path_status,"
strcat(path_statm,pro[i].pid);
strcat(path_statm,"
/statm"
strcat(path_status,pro[i].pid);
strcat(path_status,"
/status"
strcpy(path_stat,"
strcat(path_stat,pro[i].pid);
strcat(path_stat,"
/stat"
fd=open(path_status,O_RDONLY);
tt=read(fd,buffer,100);
strtok(buffer,"
:
strcpy(pro[i]m,strtok(NULL,"
));
strtok(NULL,"
strcpy(pro[i].state,strtok(NULL,"
strcpy(pro[i].ppid,strtok(NULL,"
close(fd);
fd=open(path_statm,O_RDONLY);
tt=read(fd,buf,100);
strcpy(pro[i].mem,strtok(buf,"
"
strcat(pro[i].mem,"
kb"
fd=open(path_stat,O_RDONLY);
strtok(buf,"
for(j=0;
j<
17;
j++){
strcpy(pro[i].nice,strtok(NULL,"
returntotal;
gintshow_proc(GtkWidget*treeview1){/*将进程信息插入树表中*/
inti,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));
*/
num;
model_data_new1(store,pro[i]m,pro[i].state,pro[i].pid,pro[i].ppid,pro[i].nice,pro[i].mem);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 Linux 语言 编程
![提示](https://static.bingdoc.com/images/bang_tan.gif)