Linux课程大作业.docx
- 文档编号:26111757
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:25
- 大小:461.66KB
Linux课程大作业.docx
《Linux课程大作业.docx》由会员分享,可在线阅读,更多相关《Linux课程大作业.docx(25页珍藏版)》请在冰豆网上搜索。
Linux课程大作业
Linux课程设计报告
题目
Linux课程大作业
院系
班级
姓名
指导教师
一、基础篇(给出源程序和编译运行的结果)
1、编写一个简单的c语言程序:
根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。
源代码(c):
#include
doubleaverage(intm,intn){
return(m+n)/2.0;
}
intmain(void){
intm,n=0;
printf("请输入两个数,回车分割\n");
scanf("%d",&m);
scanf("%d",&n);
printf("%d与%d的平均值是:
%lf\n",m,n,average(m,n));
}
源代码(汇编):
.file"sum.c"
.text
.globlaverage
.typeaverage,@function
average:
.LFB0:
.cfi_startproc
pushl%ebp
.cfi_def_cfa_offset8
.cfi_offset5,-8
movl%esp,%ebp
.cfi_def_cfa_register5
subl$8,%esp
movl12(%ebp),%eax
movl8(%ebp),%edx
addl%edx,%eax
movl%eax,-4(%ebp)
fildl-4(%ebp)
fldl.LC0
fdivrp%st,%st
(1)
leave
.cfi_restore5
.cfi_def_cfa4,4
ret
.cfi_endproc
.LFE0:
.sizeaverage,.-average
.section.rodata
.align4
.LC2:
.string"\350\257\267\350\276\223\345\205\245\344\270\244\344\270\252\346\225\260\357\274\214\345\233\236\350\275\246\345\210\206\345\211\262"
.LC3:
.string"%d"
.LC4:
.string"%d\344\270\216%d\347\232\204\345\271\263\345\235\207\345\200\274\346\230\257\357\274\232%lf\n"
.text
.globlmain
.typemain,@function
main:
.LFB1:
.cfi_startproc
pushl%ebp
.cfi_def_cfa_offset8
.cfi_offset5,-8
movl%esp,%ebp
.cfi_def_cfa_register5
andl$-16,%esp
subl$48,%esp
movl$0,44(%esp)
movl$.LC2,(%esp)
callputs
movl$.LC3,%eax
leal40(%esp),%edx
movl%edx,4(%esp)
movl%eax,(%esp)
call__isoc99_scanf
movl$.LC3,%eax
leal44(%esp),%edx
movl%edx,4(%esp)
movl%eax,(%esp)
call__isoc99_scanf
movl44(%esp),%edx
movl40(%esp),%eax
movl%edx,4(%esp)
movl%eax,(%esp)
callaverage
movl44(%esp),%ecx
movl40(%esp),%edx
movl$.LC4,%eax
fstpl12(%esp)
movl%ecx,8(%esp)
movl%edx,4(%esp)
movl%eax,(%esp)
callprintf
leave
.cfi_restore5
.cfi_def_cfa4,4
ret
.cfi_endproc
.LFE1:
.sizemain,.-main
.section.rodata
.align8
.LC0:
.long0
.long1073741824
.ident"GCC:
(Ubuntu/Linaro4.6.3-1ubuntu5)4.6.3"
.section.note.GNU-stack,"",@progbits
执行结果:
2、编写一个c语言程序:
打印输出所有“水仙花数”,用gdb调试程序(给出步骤,至少十步以上)。
所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。
例如,153是一水仙花数,因为153=1³+5³+3³。
源代码:
#include
intisnumber(intnumber){
intge=(number%100)%10;
intshi=(number/10)%10;
intbai=(number/100);
printf("%d\n",ge);
printf("%d\n",shi);
printf("%d\n",bai);
inttemp=ge*ge*ge+shi*shi*shi+bai*bai*bai;
if(temp==number){
return1;
}else{
return0;
}
}
intmain(){
intnumber=0;
printf("inputnumber!
\n");
scanf("%d",&number);
if(number>1000&&number<0){
printf("numberlimitsoutbounds!
\n");
}
if(isnumber(number)){
printf("numberisformat!
\n");
}else{
printf("numberisnotformat!
\n");
}
return0;
}
执行结果:
3、设计一个程序,要求输出n个整数(n也由键盘输入)中的最大值,并为它编写makefile文件,用make编译后修成返回最小值,再编译,观察有多少文件不需要重新编译。
源代码:
max.c
doublemax(doublem,doublen){
if(m returnn; }else{ returnm; } } main.c #include #include"define.h" intmain(void){ doublem,n=0; printf("请输入两个实数、\n"); scanf("%lf",&m); scanf("%lf",&n); printf("%lf与%lf最大值是: %lf\n",m,n,max(m,n)); } define.h doublemax(doublem,doublen); makefile文件: test: max.omain.o gccmax.omain.o-otest main.o: main.cdefine.h gccmain.c-c max.o: max.c gccmax.c-c 结果图: 改变程序后,只有max.c,main.c文件程序需要重新编译; 4、编写一个程序,求2-n间的素数,n由键盘输入,循环变量分别从2到n、2到(int)sqrt(n),分别测出两个循环的所用时间。 源代码: #include"stdio.h" #include"math.h" intmain() { intt1=0,t2=0; intn; intj,k,j2,k2; inti,i2; printf("输入n的值: "); scanf("%d",&n); for(i=2;i<=n;i++) { t1++; k=sqrt(i); for(j=2;j if(i%j==0) break; } if(j>=k+1){ printf("%d是素数\n",i); } } printf("\nn循环时间%d",t1); for(i2=2;i2<=(int)sqrt(n);i2++) { t2++; k2=sqrt(i2); for(j2=2;j2 if(i2%j2==0) break; } if(j2>=k+1){ printf("%d是素数\n",i2); } } printf("\nsqrt(n)循环时间%d\n",t2); return0; } 编译运行效果: 5、设计一个程序,要求将10分别以十进制、八进制和十六进制输出。 程序设计: #include intmain(){ intnumber=10; printf("十进制值: %d\n",number); printf("八进制值: %o\n",number); printf("十六进制值: %x\n",number); } 运行结果: 一、提高篇(三选二,划出程序流程图,给出程序源代码和编译运行的结果) 1、设计两个程序,要求用命名管道FIFO,实现简单的文本文件或图片文件的传输功能。 流程图: 源代码: send.c #include #include #include #include #include #include #include #include intmain(){ chars[128]; intfd;FILE*fp; fp=fopen("./a.txt","r"); mkfifo("/tmp/fifo.tst",0644); fd=open("/tmp/fifo.tst",O_WRONLY); while(fgets(s,127,fp)! =NULL){ write(fd,s,strlen(s)); printf("%s",s); } close(fd); fclose(fp); unlink("/tmp/fifo.tst"); return0; } get.c /******************get.c*****************/ #include #include #include #include #include #include #include #include intmain(){ chars[128]; intfd=open("/tmp/fifo.tst",O_RDONLY); intfd2=open("./b.txt",O_CREAT|O_WRONLY); memset(s,0,128); while(read(fd,s,128)>0){ printf("%s",s); write(fd2,s,128); printf("fd2=%d\n",fd2); } close(fd2); close(fd); return0; } 运行结果: 2、设计两个程序,要求用消息队列,实现聊天程序,每次发言后自动在后面增加当前系统时间。 增加结束字符,比如最后输入“88”后结束进程。 流程图: 发送源源代码: #include #include #include #include #include structmsgbuf{ inttype;charptr[0]; }; intmain(intargc,char*argv[]){ key_tkey;key=ftok(argv[1],100); intmsgid;msgid=msgget(key,IPC_CREAT|0600); pid_tpid;pid=fork(); if(pid==0){ while (1){ printf("plsinputmsgtosend: ");charbuf[128];fgets(buf,128,stdin); structmsgbuf*ptr=malloc(sizeof(structmsgbuf)+strlen(buf)+1); ptr->type=1;memcpy(ptr->ptr,buf,strlen(buf)+1); msgsnd(msgid,ptr,strlen(buf)+1,0);free(ptr); } } else{ structmsgbuf{ inttype;charptr[1024]; }; while (1){ structmsgbufmybuf;memset(&mybuf,'\0',sizeof(mybuf)); msgrcv(msgid,&mybuf,1024,2,0);printf("recvmsg: %s\n",mybuf.ptr); } } } 接收端源代码: #include #include #include #include #include structmsgbuf{ inttype; charptr[0]; }; intmain(intargc,char*argv[]) { key_tkey; key=ftok(argv[1],100); intmsgid; msgid=msgget(key,IPC_CREAT|0600); pid_tpid; pid=fork(); if(pid==0)//send { while (1) { printf("plsinputmsgtosend: "); charbuf[128]; fgets(buf,128,stdin); structmsgbuf*ptr=malloc(sizeof(structmsgbuf)+strlen(buf)+1); ptr->type=2;//sendmsgtype=2 memcpy(ptr->ptr,buf,strlen(buf)+1); msgsnd(msgid,ptr,strlen(buf)+1,0); free(ptr); } } else { structmsgbuf{ inttype; charptr[1024]; }; while (1) { structmsgbufmybuf; memset(&mybuf,'\0',sizeof(mybuf)); msgrcv(msgid,&mybuf,1024,1,0);//recvmsgtype=2 printf("recvmsg: %s\n",mybuf.ptr); } } } 运行结果: 3、设计两个程序,要求用mmap系统,实现简单的聊天程序。 二、应用篇 给出程序设计思路和程序设计流程图,并给出程序源代码和编译运行的结果。 设计思路: 要求生产者-消费者在固定的仓库空间条件下,生产者每生产一个产品将占用一个仓库空间,生产者生产的产品库存不能越过仓库的存储量,消费者每消费一个产品将增加一个仓库空间,消费者在仓库产品为零时不能再消费。 以下使用了两个信号量,一个用来管理消费者(sem_produce),一个用来管理生产者(sem_custom),sem_produce表示当前仓库可用空间的数量,sem_custom表示当前仓库中产品的数量。 对于生产者来说,其需要申请的资源为仓库中的剩余空间,因此,生产者在生产一个产品前需申请sem_produce信号量,当此信号量的值大于零时,即有可用空间,将生产产品,并将sem_produce值减1,同时,当其生产一个产品后,当前仓库的产品数量加1,需要将sem_custom的值自动加1.对于消费者来说,其需要申请的资源为仓库中的产品,因此,消费者在消费一个产品前需申请sem_custom信号量,当此信号量的值大于零时,即有可用产品,将消费一个产品,并将sem_custom值减1,同时,当其消费一个产品后,当前仓库的剩余空间加1,需要sem_produce的值自动加。 1、生产者-消费者问题模拟程序。 流程图: 生产者源代码: #include #include #include #include #include #include #include intsem_id; voidinit() { key_tkey; intret; unsignedshortsem_array[2]; unionsemun { intval; structsemid_ds*buf; unsignedshort*array; }arg; key=ftok(".",'s'); sem_id=semget(key,2,IPC_CREAT|0644); sem_array[0]=0;//identifytheproductor sem_array[1]=100;//identifythespace //printf("settheproductorinitvalueis0\nsetthespaceinitvalueis100\n"); arg.array=sem_array; ret=semctl(sem_id,0,SETALL,arg); if(ret==-1) printf("SETALLfailed(%d)\n",errno); //printf("\nreadthenumber\n"); printf("productorinitis%d\n",semctl(sem_id,0,GETVAL)); printf("spaceinitis%d\n\n",semctl(sem_id,1,GETVAL)); } voiddel() { semctl(sem_id,IPC_RMID,0); } intmain(intargc,char*argv[]) { structsembufsops[2]; sops[0].sem_num=0; sops[0].sem_op=1; sops[0].sem_flg=0; sops[1].sem_num=1; sops[1].sem_op=-1; sops[1].sem_flg=0; init(); printf("thisisproductor\n"); while (1) { printf("\n\nbeforeproduce: \n"); printf("productornumberis%d\n",semctl(sem_id,0,GETVAL)); printf("spacenumberis%d\n",semctl(sem_id,1,GETVAL)); semop(sem_id,(structsembuf*)&sops[1],1);//getthespacetoinstoretheproductor printf("nowproducing......\n"); semop(sem_id,(structsembuf*)&sops[0],1);//nowtellthecustomercanbucusume printf("\nafterproduce\n"); printf("spacesnumberis%d\n",semctl(sem_id,1,GETVAL)); printf("productornumberis%d\n",semctl(sem_id,0,GETVAL)); sleep(4); } del(); } 消费者源代码: #include #include #include #include #include #include #include intsem_id; voidinit() { key_tkey; key=ftok(".",'s'); sem_id=semget(key,2,IPC_CREAT|0644); //printf("semidis%d\n",sem_id); } intmain(intargc,char*argv[]) { init(); structsembufsops[2]; sops[0].sem_num=0; sops[0].sem_op=-1; sops[0].sem_flg=0; sops[1].sem_num=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 课程 作业