Linux课程大作业.docx

上传人:b****7 文档编号:26111757 上传时间:2023-06-17 格式:DOCX 页数:25 大小:461.66KB
下载 相关 举报
Linux课程大作业.docx_第1页
第1页 / 共25页
Linux课程大作业.docx_第2页
第2页 / 共25页
Linux课程大作业.docx_第3页
第3页 / 共25页
Linux课程大作业.docx_第4页
第4页 / 共25页
Linux课程大作业.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

Linux课程大作业.docx

《Linux课程大作业.docx》由会员分享,可在线阅读,更多相关《Linux课程大作业.docx(25页珍藏版)》请在冰豆网上搜索。

Linux课程大作业.docx

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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1