《操作系统报告_研究报告-商业贸易.pdf》由会员分享,可在线阅读,更多相关《操作系统报告_研究报告-商业贸易.pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.c.操作系统实验报告:学号:完成时间:2012 年 11 月 22 日.c.目录:实验一:UNIX/LINUIX入门.1 实验二:进程管理.3 实验三:线程的管理.10 实验四:利用信号实现进程间通信.15 实验五:基于消息队列和共享内存的进程间通信.18 实验六:一个进程启动另一个程序的执行.23 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便
2、数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.实验一 UNIX/LINUIX入门 一、实验目的 了解 UNIX/LINUX 运行环境,熟悉 UNIX/LINUX 的常用基本命令,熟悉和掌握UNIX/LINUX下 c 语言程序的编写、编译、调试和运行方法。二、实验内容 1、熟悉 UNIX/LINUX的常用基本命令如 ls、wh
3、o、pwd、ps 等。2、练习 UNIX/LINUX的文本行编辑器 vi 的使用方法 3、熟悉 UNIX/LINUX 下 c 语言编译器 cc/gcc 的使用方法。用 vi 编写一个简单的显示“Hello,World!”c 语言程序,用 gcc 编译并观察编译后的结果,然后运行它。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计 代码如下:#include void main()printf(hello world);五、运行结果 1 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些
4、不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.六、收获及机会 此次实验让我熟悉了 Liunx 下的文本行编辑器 vi 和
5、 c 语言编译器 cc/gcc 的使用方法。七、参考资料 实验指导书 2 实验二 进程管理 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象
6、两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.一、实验目的 加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质 二、实验内容(1)进程创建 编写一段程序,使用系统调用 fork()创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进 程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程控制 修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程 序执行时屏幕上出现的现象,并分析原因。(3
7、)进程的管道通信 编写程序实现进程的管道通信。使用系统调用 pipe()建立一个管道,二个子进程 P1 和 P2 分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收 P1,再接收 P2)。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计(1)进程创建 使用 fork()创建两个子进程,父进程等待两个子进程执行完在运行。(2)进程控制 使用 fork()创建两个子进程,父进程等待两个子
8、进程分别输出一句话在运行。(3)进程的管道通信 建立一个管道。在程序中先建立一个子进程,然后向管道中输入数据,然后从子进程中退出到父进程,读出管道数据,然后再建立一个子进程,写入数据,再读出,即可。代码如下:(1)进程创建:#include#include#include#include#include#include#define INPUT 0#define OUTPUT 1 3 void main()pid_t pid2;/定义两个子进程 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公
9、室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.pid0=fork();/创建第一个子进程 if(pid00)/判断是否创建成功 printf(Fork Failed);exit(-
10、1);else if(pid0=0)printf(bn);else pid1=fork();/创建另一子进程 if(pid10)printf(Fork Failed);exit(-1);else if(pid1=0)printf(cn);else wait(NULL);printf(an);/父进程执行 exit(0);(2)进程控制:#include#include#include#include#include#include 4#define INPUT 0#define OUTPUT 1 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的
11、礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.void main()pid_t pid2;pid0=fork();if(pid0
12、0)printf(Fork Failed);exit(-1);else if(pid0=0)printf(this is bn);else pid1=fork();if(pid10)printf(Fork Failed);exit(-1);else if(pid1=0)printf(this is cn);else wait(NULL);printf(this is an);exit(0);(3)进程的管道通信 5#include#include 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办
13、公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.#include#include#include void main()int rw2;/*定义子进程号*/pid_t pid2;i
14、nt count,count2;/*创建无名管道*/pipe(rw);char*msg1=child 1 process is sending message!n;字符串 msg1 char*msg2=child 2 process is sending message!n;字符串 msg2 char buf50,s50;int result;result=pipe(rw);if(result=-1)printf(failed in calling pipe);/*创建子进程*/if(pid0=fork()=-1)printf(Error in forkn);exit(1);if(pid0=0
15、)/printf(child 1 process is sending message!n);/*子进程向父进程写数据,关闭管道的读端*/close(rw0);write(rw1,msg1,1+strlen(msg1);close(rw1);exit(0);else if(pid1=fork()=-1)printf(Error in forkn);exit(1);if(pid1=0)/printf(child 2 process is sending message!n);/*子进程向父进程写数据,关闭管道的读端*/6 close(rw0);write(rw1,msg2,1+strlen(ms
16、g2);的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手
17、空空地去吃饭我们新.c.close(rw1);exit(0);else/*执行父进程*/printf(in the spawning(parent)process.n);/*父进程从管道读取子进程写的数据,关闭管道的写端*/close(rw1);count=read(rw0,buf,sizeof(buf);count2=read(rw0,s,sizeof(s);close(rw0);printf(%d%sn,count,buf);printf(%d%sn,count2,s);五、运行结果(1)进程创建 7 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一
18、些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.(2)进程控制 8 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该
19、如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.(3)进程的管道通信 六、收获及机会
20、 此次实验让我对进程和管道有了进一步的理解,用 fork()创建完子进程后,要用 exit()返回父进程,当需要创建两个子进程的时候,不能直接在第一个子进程中直接 fork(),要返回到父进程再用 fork()再次创建子进程,否则将无法控制。创建完管道后,在向管道中写入数据和从管道中读出数据的时候,要控制好管道的读写控制,不适当的关闭和开启管道端口,将不能使得数据得到正确的读写。这些是我此次实验最大的收获,还需要在今后的时候发现更多的问题,有更深的理解。七、参考资料 实验指导书 9 实验三 线程的管理 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不
21、该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.一、实验目的 编写 Linux 环境下的多线程程序,了解多线程的程序设计方法
22、,掌握最常用的三个函 数 pthread_create,pthread_join 和 pthread_exit 的用法 二、实验内容 1、主 程 序 创 建 两 个 线 程 myThread1 和 myThread2,每个线程打印一句话。使用 pthread_create(&id,NULL,(void*)thread,NULL)完成。提示:先定义每个线程的执行体,然后在 main 中()创建几个线程,最后主线程等待子线程结 束后再退出。2、创建两个线程,分别向线程传递如下两种类型的参数 传递整型值 传递字符 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结
23、果,并写出实验报告。四、实验设计 先定义 2 个线程的带有参数的函数,参数分别为整型(int)和字符型(char),每个函数中打印出相对应线程的话。在 main 函数中,利用 pthread_create 函数创建该两个线程,在函数参数中的第四位,写入想要传进各进程的参数。最有利用 pthread_join等待第二个结束后退出。代码如下:1、主程序创建两个线程 myThread1 和 myThread2,每个线程打印一句话。#include#include#include#include void myThread1(void)/线程 1 printf(this is phread1!n);v
24、oid myThread2(void)/线程 2 printf(this is phread2!n);int main(void)10 pthread_t id2;的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几
25、个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.int ret;ret=pthread_create(&id0,NULL,(void*)myThread1,NULL);if(ret!=0)printf(Create pthread error!n);exit(1);ret=pthread_create(&id1,NULL,(void*)myThread2,NULL);if(ret!=0)printf(Create pthread error!n);exit(1);
26、pthread_join(id0,NULL);pthread_join(id1,NULL);printf(This is the main process.n);return(0);2、创建两个线程,分别向线程传递如下两种类型的参数#include#include#include#include void myThread1(void*a)int*num;num=(int*)a;printf(create integer is%dn,*num);11 void myThread2(void*b)的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼
27、仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.char*x;x=(char*)b;printf(create char is%cn
28、,*x);int main(void)pthread_t id2;int ret;char c=L;char*a=&c;int test=23;int*attr=&test;ret=pthread_create(&id0,NULL,(void*)myThread1,(void*)attr);if(ret!=0)printf(Create pthread error!n);exit(1);pthread_join(id0,NULL);ret=pthread_create(&id1,NULL,(void*)myThread2,(void*)a);if(ret!=0)printf(Create pt
29、hread error!n);exit(1);pthread_join(id1,NULL);printf(This is the main process.n);return(0);12 五、运行结果 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺
30、高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.1、主程序创建两个线程 myThread1 和 myThread2,每个线程打印一句话。2、创建两个线程,分别向线程传递如下两种类型的参数 13 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这
31、样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.六、收获及体会 此次实验让我对线程的创建有了进一步的理解,在熟练掌握 pthread_create 和pthread_join 两个函数的应用上,进一步明白了如何向进程中传入参数。七、参考资料 实验指导书 14 的事情的
32、但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们
33、新.c.实验四 利用信号实现进程间通信 一、实验目的 学习 UNIX 类操作系统信号机制,编写 Linux 环境下利用信号实现进程间通信的方法,掌握注册信号处理程序及 signal()调用方法。二、实验内容 编写一个程序,完成下列功能:实现一个 SIGINT 信号的处理程序,注册该信号处理程序,创建一个子进程,父子进程都进入等待。SIGINT 信号的处理程序完成的任务包括打印接受到的信号的编号和进程 PID。编译并运行该程序,然后在键盘上敲 Ctrl+C,观察出现 的现象,并解释。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验
34、设计 创建一个进程,在父子进程中都注册一个用户敲中断键即 Ctrl+C 的信号处理程序,在子进程中注册一个用户定义信号 1,在父进程中注册一个用户定义信号 2,然后外部接收信号,最后在 main 函数中打印出信号的编号和进程 PID。在运行时,当用户键入 Ctrl+C 时,会自动打印出父子进程 pid 值,但信号的编号始终是父进程中注册的用户定义信号。代码如下:#include#include#include#include#define MAXSTACK 20 int stackMAXSTACK;int a=0;int b=0;sem_t sem,sem1;void ReadData1(vo
35、id)FILE*fp=fopen(1.dat,r);sem_wait(&sem1);int i;for(i=0;i10;i+)fscanf(fp,%d,&stacka+);sem_post(&sem1);sem_post(&sem);fclose(fp);void ReadData2(void)15 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数
36、落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.FILE*fp=fopen(2.dat,r);sem_wait(&sem1);int i;for(i=0;i8;i+)fscanf(fp,%d,&stacka+);sem_post(&sem1);sem_post(&sem);fclose(fp);void HandleData1(
37、void)int i;sem_wait(&sem);for(i=0;i4;i+)int m=stackb+;int n=stackb+;printf(Plus:%d+%d=%dn,m,n,m+n);void HandleData2(void)int i;sem_wait(&sem);for(i=0;i4;i+)int m=stackb+;int n=stackb+;printf(mul:%d*%d=%dn,m,n,m*n);int main(void)pthread_t t1,t2,t3,t4;sem_init(&sem,0,0);sem_init(&sem1,0,1);pthread_cre
38、ate(&t1,NULL,(void*)HandleData1,NULL);pthread_create(&t2,NULL,(void*)HandleData2,NULL);pthread_create(&t3,NULL,(void*)ReadData1,NULL);pthread_create(&t4,NULL,(void*)ReadData2,NULL);pthread_join(t1,NULL);16 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮
39、老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.五、运行结果 六、收获及体会 此次实验让我学会了在 Linux 环境下利用信号实现进程间通信的方法,掌握注册信号处理程序及 signal()调用方法,也掌握了接收信号的写法
40、。并在试验中,可通过用户自己输入信号来产生信号的编号,但是通过注册 SIGINT 信号处理程序打印出的信号编号只是父进程中创建的用户定义信号 2,这点还是需要进一步讨论。但总的来说,对利用信号实现进程间的通信,有了更深入的一个了解,收获很大。七、参考资料 实验指导书 17 实验五 基于消息队列和共享内存 的进程间通信 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过
41、程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.一、实验目的 Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:1.Linux 支持的消息通信机制及其使用方法 2.Linux 系统的共享存储区的原理及使用方法。二、实验内容 1.消息的创建、发送和接收 使用消息调
42、用 msgget()、msgsnd()、msggrev()、msgctrl()编制长度为 1K 的消息的发送和接收程序。2.共享存储区的创建、附接和断接 使用系统调用 shmget()、shmat()、shmctl(),编制一个与上述功能相同的程序。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计 1.消息队列:先定义一个消息结构,包含消息类型和文本长度。在 SERVER 函数中,首先获得一个 KEY为 75 的消息的描述符,然后利用 do while 循环来判断当消息类型为 1 的时候打印输出。在 CLIENT函数中,先获
43、得消息队列,然后利用 for 循环将消息类型从10赋值到 1,发送队列,并打印输出。最后在 main 函数中调用这两个函数。#include#include#include#include#define MSGKEY 75 struct msgform/*消息结构*/long mtype;/*消息类型*/char mtexe1030;/*文本长度*/msg;int msgqid,i;void CLIENT()int i;msgqid=msgget(MSGKEY,0777);/*获得消息的描述符 msgqid*/for(i=10;i=1;i-)/*将消息类型由 10到 1 发送*/msg.mty
44、pe=i;18 printf(client)sentn);msgsnd(msgqid,&msg,1024,0);/*发送消息 msg入 msgid 消息队列*/的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑
45、份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.exit(0);void SERVER()msgqid=msgget(MSGKEY,0777|IPC_CREAT);do msgrcv(msgqid,&msg,1030,0,0);/*从队列 msgid 接受消息 msg*/printf(server)receiven);while(msg.mtype!=1);/*消息类型为 1 时,释放队列*/msgctl(msgqid,IPC_RMID,0);exit(0);main
46、()if(fork()SERVER();else CLIENT();wait(0);wait(0);2.共享存储区:先获取共享区,KEY为 75,并获得描述符,然后将该共享存储区附接到 addr这个虚拟地址上,如消息队列类似,利用 while 循环从 10 到 1 打印输出,并将 i 值赋给 addr。在 SERVER 中,创建共享存储区,并将起始地址也设置为 addr,服务进程共享存储区,所以直接用 while 循环输出打印“receive”。代码如下:#include#include#include#define SHMKEY 75/*定义共享区关键词*/int shmid,i;int*a
47、ddr;CLIENT()int i;19 shmid=shmget(SHMKEY,1024,0777);/*获取共享区*/addr=shmat(shmid,0,0);/*共享区起始地址为 addr*/的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高
48、级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.for(i=9;i=0;i-)while(*addr!=-1);printf(client)sentn);*addr=i;exit(0);SERVER()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);do*addr=-1;/*服务进程使用共享区*/while(*addr=-1);printf(serve
49、r)receivedn);while(*addr);shmctl(shmid,IPC_RMID,0);exit(0);main()if(fork()SERVER();if(fork()CLIENT();wait(0);wait(0);20 五、运行结果 的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面我们就一起来看看吧我第一次陪老板出去吃饭办公室的一个前辈说有人给老板灌酒的时候要帮老板挡酒所以我 到老板面前让老板也一起喝看到我这样老板只能硬着头皮喝第二天清醒了后我吃饭的过程告诉前辈前辈便数落我不懂事哪有一边帮老板挡酒一边还给老板灌酒的办
50、公室小突然说请吃饭还说会带女朋友过来吃饭的地方是个挺高级的餐 其他同事纷纷拿出了自己或者几个凑份子买的礼物送给他们只有我像个外星人一样张大了嘴巴瞪圆了眼睛可以想象两手空空的我在那个场合下多为难想想也是我既然知道没人会平白无故地请客怎么还会傻到两手空空地去吃饭我们新.c.1 消息队列:2、共享存储区:21 六、收获及体会 此次实验让我对消息队列的获取、传送和共享存储区有了更加深入的了解。理论上来说应该是 client 和 server 交替出现,实际上是 client 先发送了两条,而且最后的事情的但是有时候一些刚刚入职的新人朋友们却不知道该如何做才好因此在无意中就那样的犯了一些不该犯的礼仪下面