欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    Linux信号量机制.docx

    • 资源ID:5724094       资源大小:57.86KB        全文页数:14页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Linux信号量机制.docx

    1、Linux信号量机制大作业 -Linux信号量机制 姓名: 学号: 班级:010914日期:2012年5月23日1 需求说明进程A、B、C,分别调用过程get、copy、put对缓冲区S和T进行操作。其中get负责从文件F_in中把数据块读入并输出缓冲区S,copy负责从S中提取数据块并复制到缓冲区T中,put负责从缓冲区T中取出信息存入到本地文件F_out中。实现get、copy、put的操作过程。功能需求: 提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小 利用信号量实现互斥 同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法

    2、访问,可参考读写者问题解决方案 支持文件输入、输出非功能需求: 程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)过程需求: 使用vi进行代码的编写 使用make工具建立工程 将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编译。2 设计说明2.1 结构设计 进程1通过get函数将源文件载入缓冲区S;进程2通过copy函数将数据从缓冲区S复制到缓冲区T内;进程3通过put函数将缓冲区T内的数据输出到目标文件。2.2 功能设计1.提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小。2.利用信号量实现互斥。3.同时产生多个get、co

    3、py和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问。3 测试和使用说明3.1 使用说明1、执行make命令,编译程序test; 2、执行test; 3、输入源文件的路径 4、输入目标文件的文件名 5、输入缓冲区大小 6、程序执行完毕3.2 测试说明执行make命令,编译test。输入文件fin内容如上图。./fin运行可执行程序test,程序请求用户指定输入文件、输出文件和缓冲区大小。程序获取用户输入后,根据设计要求将输入文件的内容复制到输出文件中,并显示执行过程和执行状态。输出文件fout如上图所示。4 程序清单头文件para.h#include #inclu

    4、de #include #include #include #include #include #define PERMS S_IRUSR|S_IWUSRFILE *fin,*fout;int S_sem,S_n,S_e,T_sem,T_n,T_e;int end_mark;struct sembuf semwait,semsignal;C文件sem.c #include #include #include #include #include #include #include #include #include void init_semaphore_struct(struct sembuf

    5、 *sem,int semnum,int semop,int semflg) sem-sem_num = semnum; sem-sem_op = semop; sem-sem_flg = semflg;int del_semaphore(int semid)#if 1 return semctl(semid,0,IPC_RMID);#endifC文件get.c #include #include #include #include #include #include #include #include #include #include #include para.hvoid get(int

    6、 BUF_SIZE) long length,times; int S_segment_id; char *S_shared_memory; char string1024; struct shmid_ds shmbuffer; memset(string,0,1024); S_segment_id = shmget(99,BUF_SIZE,IPC_CREAT|0666); S_shared_memory = (char *)shmat(S_segment_id,NULL,0); shmctl(S_segment_id,IPC_STAT,&shmbuffer); fseek(fin,0,SEE

    7、K_END); length = ftell(fin); fseek(fin,0,SEEK_SET); times = length / BUF_SIZE; while( times ) fread(string,BUF_SIZE,1,fin); semop(S_e,&semwait,1); semop(S_sem,&semwait,1); strcpy(S_shared_memory,string); printf(Get File_input to Buffer_S OK,%sn,S_shared_memory); semop(S_sem,&semsignal,1); semop(S_n,

    8、&semsignal,1); times-; printf(End Getting.n); shmdt(S_shared_memory);C文件copy.c #include #include #include #include #include #include #include #include #include #include #include para.hvoid copy(int BUF_SIZE) char string1024; int T_segment_id; char *T_shared_memory; struct shmid_ds T_shmbuffer; T_seg

    9、ment_id = shmget(100,BUF_SIZE,IPC_CREAT|0666); T_shared_memory = (char *)shmat(T_segment_id,NULL,0); shmctl(T_segment_id,IPC_STAT,&T_shmbuffer); int S_segment_id; char *S_shared_memory; struct shmid_ds S_shmbuffer; S_segment_id = shmget(99,BUF_SIZE,IPC_CREAT|0666); S_shared_memory = (char *)shmat(S_

    10、segment_id,NULL,0); shmctl(S_segment_id,IPC_STAT,&S_shmbuffer); while(!end_mark) semop(S_n,&semwait,1); semop(S_sem,&semwait,1); strcpy(string,S_shared_memory); memset(S_shared_memory,0,BUF_SIZE); semop(S_sem,&semsignal,1); semop(S_e,&semsignal,1); semop(T_e,&semwait,1); semop(T_sem,&semwait,1); str

    11、cpy(T_shared_memory,string); printf(Copy Buffer_S to Buffer_T OK,%sn,T_shared_memory); semop(T_sem,&semsignal,1); semop(T_n,&semsignal,1); printf(End Copy.n); shmdt(S_shared_memory); shmdt(T_shared_memory);C文件put.c #include #include #include #include #include #include #include #include #include #inc

    12、lude #include para.hvoid put(int BUF_SIZE) int T_segment_id; char *T_shared_memory; struct shmid_ds T_shmbuffer; T_segment_id = shmget(100,BUF_SIZE,IPC_CREAT|0666); T_shared_memory = (char *)shmat(T_segment_id,NULL,0); shmctl(T_segment_id,IPC_STAT,&T_shmbuffer); while(!end_mark) semop(T_n,&semwait,1

    13、); semop(T_sem,&semwait,1); if (fprintf(fout,%s,T_shared_memory) 0) printf(Put Buffer_T to File_input OK,%sn,T_shared_memory); memset(T_shared_memory,0,BUF_SIZE); semop(T_sem,&semsignal,1); semop(T_e,&semsignal,1); printf(End Putting.n); shmdt(T_shared_memory);C文件main.c #include #include #include #i

    14、nclude #include #include #include #include #include #include #include para.hvoid stop() end_mark = 1;void main() int BUF_SIZE; char *input = (char *)malloc(1024); memset(input,0,1024); init_semaphore_struct(&semwait,0,-1,0); init_semaphore_struct(&semsignal,0,1,0); S_sem = semget(IPC_PRIVATE,1,PERMS

    15、); S_n = semget(IPC_PRIVATE,1,PERMS); S_e = semget(IPC_PRIVATE,1,PERMS); T_sem = semget(IPC_PRIVATE,1,PERMS); T_n = semget(IPC_PRIVATE,1,PERMS); T_e = semget(IPC_PRIVATE,1,PERMS); semop(S_e,&semsignal,1); semop(S_sem,&semsignal,1); semop(T_e,&semsignal,1); semop(T_sem,&semsignal,1); pid_t pid1,pid2;

    16、 while (1) printf(Please input the path of File_input:); scanf(%s,input); if ( (fin = fopen(input,rt) = NULL ) printf(Cant find the file.n); else break; while (1) printf(Please input the path of File_output:); scanf(%s,input); if ( (fout = fopen(input,wt) = NULL ) printf(Cant find the file.n); else

    17、break; while (1) printf(Please input the size of Buffer (interger less than 1024):); scanf(%d,&BUF_SIZE); if ( BUF_SIZE 1024 ) printf(The size of Buffer is too big.n); else break; while(pid1 = fork() = -1); if (pid1 0) get(BUF_SIZE); sleep(1); kill(pid1,10); wait(0); wait(0); fclose(fin); fclose(fou

    18、t); del_semaphore(S_sem); del_semaphore(S_n); del_semaphore(S_e); del_semaphore(T_sem); del_semaphore(T_n); del_semaphore(T_e); exit(0); else while(pid2 = fork() = -1); if (pid2 0) signal(10,stop); copy(BUF_SIZE); kill(pid2,12); wait(0); exit(0); else signal(12,stop); put(BUF_SIZE); exit(0); makefile文件makefile test:main.o sem.o get.o copy.o put.o cc main.o sem.o get.o copy.o put.o -o testmain.o:main.c para.h cc -c main.csem.o:sem.c cc -c sem.cget.o:get.c para.h cc -c get.ccopy.o:copy.c para.h cc -c copy.cput.o:put.c para.h cc -c put.cclean: rm -f *.o


    注意事项

    本文(Linux信号量机制.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开