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=