欢迎来到天天文库
浏览记录
ID:55413436
大小:98.50 KB
页数:3页
时间:2020-05-12
《操作系统实验三-进程.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、操作系统实验三完成人:谌浩旗学号:日期:2011-4-8【实验内容】在Linux操作系统上,利用fork()创建一个子进程去生成Fibonacci数列,并采用POSIXsharememory将结果传递给父进程,具体要求见”OperatingSystemConcepts(SeventhEdition)”Chapter3后的习题3.10。编写程序并在父进程中输出测试结果【实验目的】1.通过实验,了解Unix/Linux中新进程的创建,以及父进程与子进程之间关系2.通过实验,掌握共享内存的创建、使用和删除【设计思路】1.在创建子进程的前面用相应的函数创建共享内存2.创建子进程,并在子进程内修改内存
2、中存储的值3.在父进程中输出内存中存储的值【流程图】创建共享内存创建子进程并修改内存的值父进程中输出修改后的值【主要数据结构及其说明】structFibonacci{//结构体,用来存储longfib_sequence[MAX_SEQUENCE];//数组,存储Fibonacci数值intsequence_size;//数组的大小}shared_data;【源程序并附上注释】#include#include#include#include#include#include3、it.h>#defineMAX_SEQUENCE10//定义共享内存段数据结构typedefstruct{longfib_sequence[MAX_SEQUENCE];intsequence_size;}shared_data;intmain(intargc,char**argv){//读取表示数列长度的参数,将其转化为int型intsize=0;inti=-1;while(argv[2][++i]!=' ')size=size*10+(int)argv[2][i]-(int)'0';//参数合法判断if(size<04、5、size>MAX_SEQUENCE){printf("wrongar6、gument");return-1;}//共享内存段标识符intsegment_id;//一个指向共享内存段的指针shared_data*shared_memory;//创建共享内存段segment_id=shmget(IPC_PRIVATE,sizeof(shared_data),S_IRUSR7、S_IWUSR);//加入共享内存shared_memory=(shared_data*)shmat(segment_id,NULL,0);//将来自命令行的参数赋值给shared_datashared_memory->sequence_size=size;//创建子进程pid_tpid;pi8、d=fork();//创建失败if(pid<0){printf("createchildprocessfailed");return-1;}//子进程操作elseif(pid==0){//构造Fabonacci数列,并将数据写入共享内存段longpreNum=0,behNum=1,temp;for(inti=0;isequence_size;++i){shared_memory->fib_sequence[i]=behNum;temp=preNum+behNum;preNum=behNum;behNum=temp;}//子进程分离共享内存段shmdt(sh9、ared_memory);}//父进程操作elseif(pid>0){//等待子进程退出wait(NULL);//打印共享内存段的信息printf("Fibonacci:");for(inti=0;isequence_size;++i)printf("%ld",shared_memory->fib_sequence[i]);printf("");//父进程分离共享内存段shmdt(shared_memory);//父进程删除共享内存段shmctl(segment_id,IPC_RMID,NULL);}return0;}【程序运行时的初值和运行结果】【实验体10、会】在使用函数创建共享内存时,应当注意函数的返回形式,必要的时候要做强制转换。
3、it.h>#defineMAX_SEQUENCE10//定义共享内存段数据结构typedefstruct{longfib_sequence[MAX_SEQUENCE];intsequence_size;}shared_data;intmain(intargc,char**argv){//读取表示数列长度的参数,将其转化为int型intsize=0;inti=-1;while(argv[2][++i]!=' ')size=size*10+(int)argv[2][i]-(int)'0';//参数合法判断if(size<0
4、
5、size>MAX_SEQUENCE){printf("wrongar
6、gument");return-1;}//共享内存段标识符intsegment_id;//一个指向共享内存段的指针shared_data*shared_memory;//创建共享内存段segment_id=shmget(IPC_PRIVATE,sizeof(shared_data),S_IRUSR
7、S_IWUSR);//加入共享内存shared_memory=(shared_data*)shmat(segment_id,NULL,0);//将来自命令行的参数赋值给shared_datashared_memory->sequence_size=size;//创建子进程pid_tpid;pi
8、d=fork();//创建失败if(pid<0){printf("createchildprocessfailed");return-1;}//子进程操作elseif(pid==0){//构造Fabonacci数列,并将数据写入共享内存段longpreNum=0,behNum=1,temp;for(inti=0;isequence_size;++i){shared_memory->fib_sequence[i]=behNum;temp=preNum+behNum;preNum=behNum;behNum=temp;}//子进程分离共享内存段shmdt(sh
9、ared_memory);}//父进程操作elseif(pid>0){//等待子进程退出wait(NULL);//打印共享内存段的信息printf("Fibonacci:");for(inti=0;isequence_size;++i)printf("%ld",shared_memory->fib_sequence[i]);printf("");//父进程分离共享内存段shmdt(shared_memory);//父进程删除共享内存段shmctl(segment_id,IPC_RMID,NULL);}return0;}【程序运行时的初值和运行结果】【实验体
10、会】在使用函数创建共享内存时,应当注意函数的返回形式,必要的时候要做强制转换。
此文档下载收益归作者所有