进程间通信实验报告

合集下载

实验四 进程间通信实验(一)

实验四 进程间通信实验(一)

实验四进程间通信实验(一)实验目的:1.通过基础实验,基本掌握共享内存的程序设计。

2.通过编写程序,使读者掌握消息队列的设计方法。

实验内容:1.共享内存程序设计:创建两个进程,在A进程中创建一个共享内存,并向其写入数据,通过B进程从共享内存中读出数据。

2.消息队列程序设计:创建一个消息队列,如何使用消息队列进行两个进程(发送端和接受端)之间的通信,包括消息队列的创建、消息发送与读取、消息队列的撤销和删除等多种操作。

实验过程:(一)共享内存程序设计❝函数说明:共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域。

第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。

到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。

除此之外,当然还有撤销映射的操作,其函数为shmdt()。

❝共享内存的用法:使用共享内存进行进程间通信一般要经历下面几个步骤:[1]分配:进程通过调用shmget来分配一个共享内存块。

[2]映射:要让一个进程获取对一块共享内存的访问,这个进程必须先调用shmat映射共享内存。

[3]脱离与释放:当进程结束使用共享内存时,使用shmdt使共享内存脱离进程。

当不再需要共享内存时,使用shmctl(sid,IPC_RMID,0)删除它。

实验步骤及代码:1)自己建立文件夹,然后分别编辑shm_com.h、shm1.c、shm2.c./*shm_com.h*/#define TEXT_SZ 2048struct shared_use_st{int written_by_you;char some_text[TEXT_SZ];};--------------------------------------------------------------------------------------------------------------------功能描述:本程序申请和分配共享内存,然后轮询并读取共享内存中的数据,直至读到“end”/*shm1.c*/#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include "shm_com.h"int main(void){int running=1;void *shared_memory=(void *)0;struct shared_use_st *shared_stuff;int shmid;/*创建共享内存*/shmid=shmget((key_t) 1234,sizeof(struct shared_use_st),0666|IPC_CREAT);if(shmid==-1){fprintf(stderr,"shmget failed\n");exit(EXIT_FAILURE);}/*映射共享内存*/shared_memory=shmat(shmid,(void *)0,0);if(shared_memory==(void *)-1){fprintf(stderr,"shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n",(int)shared_memory);/*让结构体指针指向这块共享内存*/shared_stuff=(struct shared_use_st *)shared_memory;/*控制读写顺序*/shared_stuff->written_by_you=0;/*循环地从共享内存中读数据,直到读到“end”为止*/while(running){if(shared_stuff->written_by_you){printf("You wrote:%s",shared_stuff->some_text);/*读进程睡眠1秒,同时会导致写进程睡眠1秒,做到先读后写*/sleep(1);shared_stuff->written_by_you=0;if(strncmp(shared_stuff->some_text,"end",3)==0){running=0;//结束循环}}}/*删除共享内存*/if(shmdt(shared_memory)==-1){fprintf(stderr,"shmdt failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}----------------------------------------------------------------------------------------------------------------功能描述:本程序申请了上一段程序相同的共享内存,然后循环地向共享内存中写数据,直至写入“end”/*shm2.c*/#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include "shm_com.h"int main(void){int running=1;void *shared_memory=(void *)0;struct shared_use_st *shared_stuff;char buffer[BUFSIZ];int shmid;/*创建共享内存*/shmid=shmget((key_t) 1234,sizeof(struct shared_use_st),0666|IPC_CREAT);if(shmid==-1){fprintf(stderr,"shmget failed\n");exit(EXIT_FAILURE);}/*映射共享内存*/shared_memory=shmat(shmid,(void *)0,0);if(shared_memory==(void *)-1){fprintf(stderr,"shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n",(int)shared_memory); /*让结构体指针指向这块共享内存*/shared_stuff=(struct shared_use_st *)shared_memory;/*循环地向共享内存中写入数据,直到写入的为“end”为止*/ while(running){while(shared_stuff->written_by_you==1){sleep(1); //等到读进程读完之后再写printf("waiting for client...\n");}printf("ENter some text:");fgets(buffer,BUFSIZ,stdin);strncpy(shared_stuff->some_text,buffer,TEXT_SZ);shared_stuff->written_by_you=1;if(strncmp(buffer,"end",3)==0){running=0; //结束循环}}/*删除共享内存*/if(shmdt(shared_memory)==-1){fprintf(stderr,"shmdt failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}2)使用gcc shm1.c –o shm1和gcc shm2.c –o shm2 分别编译shm1.c和shm2.c3)在一个终端运行shm1,在另一个终端运行shm2。

实验三-进程通讯实验报告

实验三-进程通讯实验报告

实验三进程通讯实验报告【姓名】【学号】【实验题目】进程通讯——消息队列与共享存储区【实验目的】(1)掌握进程间通讯的编程方法;(2)加深对进程并发执行的理解;(3)学习利用消息队列和共享存储区实现进程通信的方法。

【实验内容】设计一个多进程并发运行的程序,它由不同的进程完成下列工作:(1)接收键盘输入进程负责接收用户的键盘输入,并以适当的方式将由键盘获得的数据交给其它进程处理。

(2)显示进程负责全部数据显示任务,包括键盘输入数据的显示和提示信息的显示。

(3)分发数据进程将键盘输入的数据分为3类,即字母、数字和其它,并分别将字母写入文件letter.txt 中,数字写入文件number.txt中,除字母和数字外其它数据丢弃。

【实验要求】1、程序能以适当的方式提示用户输入数据;2、提示用户有数据被丢弃;3、全部的显示任务必须由显示进程完成;4、整个程序能够连续处理多组输入数据,直到用户输入“quit”字符串,整个程序结束;5、进一步要求:同时采用共享存储区和消息2种方法实现进程之间的通信,并比较这2种通信方法的利弊。

【实验方法】1、利用fork()函数创建2个子进程,用一个父进程和两个子进程完成上面的三个实验任务,用子进程1实现分发数据任务,子进程2实现接受键盘输入任务,父进程实现全部的显示任务。

2、同时通过共享存储区和消息队列两种进程通讯方式实现上面三个进程之间的同步和互斥。

3、利用while()循环、kill()函数和signal()函数实现连续多组数据输入。

【程序结构】·数据结构:消息队列、字符数组;·程序结构:顺序结构、if-else分支结构和while循环结构;·主要算法:无特别算法【实验结果】1、有代表性的执行结果:[stud13@localhost stud13]$ cc ipc.c[stud13@localhost stud13]$ ./a.outPlease input a line:∟operatingsystem01234-=,.Your message is:operatingsystem01234-=,.The characters deserted are:-=,.Please input a line:∟xushengju6651001!@#$%^&*()Your message is:xushengju6651001!@#$%^&*()The characters deserted are:!@#$%^&*()Please input a line:∟Hello123Your message is:Hello123Please input a line:∟quit[stud13@localhost stud13]$ cat letter.txtOperatingsystemxushengjuHello[stud13@localhost stud13]$ cat number.txt 012346651001123[stud13@localhost stud13]$2、结果分析及解释:在创建子进程1时,由于先返回子进程的ID号,msgrcv(msgid,&msg,BUFSIZE,0,0)一直都是非0值,故循环等待。

实验五:进程间通信

实验五:进程间通信

实验五:进程间通信实验五:进程间通信●实验目的:学会进程间通信方式:无名管道,有名管道,信号,共享内存●实验要求:(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一共享内存,实现放进程间通信●实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台●实验步骤:(一)无名管道的使用1、编写实验代码pipe_rw.c#include#include#include#include#include#includeint main(){int pipe_fd[2];pid_t pid;char buf_r[100];char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r));/*创建管道*/if(pipe(pipe_fd)<0){printf("pipe create error\n");return -1;}/*创建子进程*/if((pid=fork())==0) //子进程执行代码{//1、子进程先关闭了管道的写端//2、让父进程先运行,这样父进程先写子进程才有内容读//3、读取管道的读端,并输出数据//4、关闭管道的读端,并退出}else if(pid>0) //父进程执行代码{//1、父进程先关闭了管道的读端//2、向管道写入字符串数据//3、关闭写端,并等待子进程结束后退出}return 0;}2、编译应用程序pipe_rw.c3、运行应用程序子进程先睡两秒让父进程先运行,父进程分两次写入“hello”和“pipe”,然后阻塞等待子进程退出,子进程醒来后读出管道里的内容并打印到屏幕上再退出,父进程捕获到子进程退出后也退出4、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。

进程管理实验报告分析(3篇)

进程管理实验报告分析(3篇)

第1篇一、实验背景进程管理是操作系统中的一个重要组成部分,它负责管理计算机系统中所有进程的创建、调度、同步、通信和终止等操作。

为了加深对进程管理的理解,我们进行了一系列实验,以下是对实验的分析和总结。

二、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。

2. 进一步认识并发执行的实质。

3. 分析进程争用资源的现象,学习解决进程互斥的方法。

4. 了解Linux系统中进程通信的基本原理。

三、实验内容1. 使用系统调用fork()创建两个子进程,父进程和子进程分别显示不同的字符。

2. 修改程序,使每个进程循环显示一句话。

3. 使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号,实现进程的终止。

4. 分析利用软中断通信实现进程同步的机理。

四、实验结果与分析1. 实验一:父进程和子进程分别显示不同的字符在实验一中,我们使用fork()创建了一个父进程和两个子进程。

在父进程中,我们打印了字符'a',而在两个子进程中,我们分别打印了字符'b'和字符'c'。

实验结果显示,父进程和子进程的打印顺序是不确定的,这是因为进程的并发执行。

2. 实验二:每个进程循环显示一句话在实验二中,我们修改了程序,使每个进程循环显示一句话。

实验结果显示,父进程和子进程的打印顺序仍然是随机的。

这是因为并发执行的进程可能会同时占用CPU,导致打印顺序的不确定性。

3. 实验三:使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号在实验三中,我们使用signal()捕捉键盘中断信号(按c键),然后通过kill()向两个子进程发送信号,实现进程的终止。

实验结果显示,当按下c键时,两个子进程被终止,而父进程继续执行。

这表明signal()和kill()在进程控制方面具有重要作用。

4. 实验四:分析利用软中断通信实现进程同步的机理在实验四中,我们分析了利用软中断通信实现进程同步的机理。

进程通信的实验报告

进程通信的实验报告

一、实验目的1. 理解进程通信的概念和作用。

2. 掌握进程通信的常用方法,包括管道、消息队列、信号量等。

3. 通过编程实践,加深对进程通信机制的理解和应用。

二、实验环境操作系统:Linux开发环境:gcc三、实验内容1. 管道通信2. 消息队列通信3. 信号量通信四、实验步骤及分析1. 管道通信(1)实验步骤1)创建一个父进程和一个子进程;2)在父进程中创建一个管道,并将管道的读端和写端分别赋给父进程和子进程;3)在父进程中,通过管道的写端发送数据给子进程;4)在子进程中,通过管道的读端接收父进程发送的数据;5)关闭管道的读端和写端;6)结束进程。

(2)实验分析通过管道通信,实现了父进程和子进程之间的数据传递。

管道是半双工通信,数据只能单向流动。

在本实验中,父进程向子进程发送数据,子进程接收数据。

2. 消息队列通信(1)实验步骤1)创建一个消息队列;2)在父进程中,向消息队列中发送消息;3)在子进程中,从消息队列中接收消息;4)删除消息队列;5)结束进程。

(2)实验分析消息队列是一种进程间通信机制,允许不同进程之间传递消息。

消息队列的创建、发送、接收和删除等操作都是通过系统调用实现的。

在本实验中,父进程向消息队列发送消息,子进程从消息队列接收消息,实现了进程间的消息传递。

3. 信号量通信(1)实验步骤1)创建一个信号量;2)在父进程中,对信号量执行P操作,请求资源;3)在子进程中,对信号量执行V操作,释放资源;4)结束进程。

(2)实验分析信号量是一种用于实现进程同步的机制。

在进程通信中,信号量可以用来协调多个进程对共享资源的访问。

在本实验中,父进程和子进程通过信号量实现了对共享资源的同步访问。

五、实验结果1. 管道通信实验结果:父进程成功向子进程发送数据,子进程成功接收数据。

2. 消息队列通信实验结果:父进程成功向消息队列发送消息,子进程成功从消息队列接收消息。

3. 信号量通信实验结果:父进程成功获取资源,子进程成功释放资源。

进程通讯管理实验报告(3篇)

进程通讯管理实验报告(3篇)

第1篇一、实验目的1. 理解进程通信的概念和原理;2. 掌握进程通信的常用机制和方法;3. 能够使用进程通信机制实现进程间的数据交换和同步;4. 增强对操作系统进程管理模块的理解。

二、实验环境1. 操作系统:Linux2. 编程语言:C3. 开发环境:GCC三、实验内容1. 进程间通信的管道机制2. 进程间通信的信号量机制3. 进程间通信的共享内存机制4. 进程间通信的消息队列机制四、实验步骤1. 管道机制(1)创建管道:使用pipe()函数创建管道,将管道文件描述符存储在两个变量中,分别用于读和写。

(2)创建进程:使用fork()函数创建子进程,实现父子进程间的通信。

(3)管道读写:在父进程中,使用read()函数读取子进程写入的数据;在子进程中,使用write()函数将数据写入管道。

(4)关闭管道:在管道读写结束后,关闭对应的管道文件描述符。

2. 信号量机制(1)创建信号量:使用sem_open()函数创建信号量,并初始化为1。

(2)获取信号量:使用sem_wait()函数获取信号量,实现进程同步。

(3)释放信号量:使用sem_post()函数释放信号量,实现进程同步。

(4)关闭信号量:使用sem_close()函数关闭信号量。

3. 共享内存机制(1)创建共享内存:使用mmap()函数创建共享内存区域,并初始化数据。

(2)映射共享内存:在父进程和子进程中,使用mmap()函数映射共享内存区域。

(3)读写共享内存:在父进程和子进程中,通过指针访问共享内存区域,实现数据交换。

(4)解除映射:在管道读写结束后,使用munmap()函数解除映射。

4. 消息队列机制(1)创建消息队列:使用msgget()函数创建消息队列,并初始化消息队列属性。

(2)发送消息:使用msgsnd()函数向消息队列发送消息。

(3)接收消息:使用msgrcv()函数从消息队列接收消息。

(4)删除消息队列:使用msgctl()函数删除消息队列。

进程控制与进程通信程序实验报告

进程控制与进程通信程序实验报告

进程控制与进程通信程序实验报告一、引言进程是计算机系统中最基本的概念之一,是操作系统中最小的资源管理单位。

进程控制与进程通信是操作系统中重要的内容,涉及到进程的创建、调度和终止,以及进程间的信息传递和同步管理。

本实验旨在通过编写进程控制与进程通信程序,加深对操作系统中进程管理和通信机制的理解。

二、实验目的1. 理解进程的概念和特点,掌握进程的创建、调度和终止方法。

2. 掌握进程通信的基本原理和方法,包括共享内存、管道、消息队列和信号量等。

3. 能够编写简单的进程控制和进程通信程序。

三、实验内容1. 进程控制实验:编写一个程序,实现进程的创建、调度和终止。

通过调用系统调用函数,创建多个子进程,并通过进程控制函数实现父子进程的协作与同步。

2. 进程通信实验:编写一个程序,实现进程间的信息传递和同步管理。

通过共享内存、管道、消息队列或信号量等机制,实现不同进程之间的数据交换和共享。

四、实验步骤1. 进程控制实验:(1)创建父进程和子进程:使用fork()函数创建子进程,并通过判断返回值来区分父子进程。

(2)调度子进程:使用wait()函数等待子进程的结束,以实现父子进程的同步。

(3)终止子进程:使用exit()函数终止子进程的运行。

2. 进程通信实验:(1)共享内存:使用shmget()函数创建共享内存段,使用shmat()函数映射共享内存到进程的地址空间,实现共享数据的读写。

(2)管道:使用pipe()函数创建管道,使用fork()函数创建子进程,通过读写管道实现进程间的数据传输。

(3)消息队列:使用msgget()函数创建消息队列,使用msgsnd()函数向消息队列发送消息,使用msgrcv()函数从消息队列接收消息,实现进程间的消息传递。

(4)信号量:使用semget()函数创建信号量,使用semop()函数对信号量进行P操作和V操作,实现进程间的同步和互斥。

五、实验结果通过实验,我们成功实现了进程的创建、调度和终止,以及进程间的信息传递和同步管理。

实验三 进程间的通信

实验三 进程间的通信

实验三进程间的通信1、实验目的学习如何利用管道机制、消息缓冲队列进行进程间的通信,并加深对上述通信机制的理解。

2、实验内容(1)了解系统调用pipe()、msgget()、msgsnd()、msgrcv()的功能和实现过程。

(2)编写一段程序,使其用管道来实现父子进程之间的进程通信。

子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent!”。

父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。

(3)编写一段程序,使用消息缓冲队列来实现client进程和server进程之间的通信。

server进程先建立一个关键字为SVKEY (如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的client进程的进程标识数,表示正在为client进程服务;然后再向client进程发送一应答消息,该消息类型是client 进程的进程标识数,而正文则是server进程自己的标识数。

client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数)以取得server进程的服务,并等待server 进程发来的应答;然后显示字符串“receive reply form”和接收到的server进程的标识符。

1、client.c2、server.c3、思考题上述通信机制各有什么特点?它们分别适合于何种场合?答:管道通信的特点:(1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;(2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);(3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

(4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。

实验六 进程间通信

实验六 进程间通信

3.2 实验内容(2)

进程的管道通信
编写程序,实现进程的管道通信:父进程使用系统调用pipe() 建立一个管道。创建两个子进程p1和p2,分别向管道个发一 条信息后结束: Child 1 is sending a message to parent. Child 2 is sending a message to parent. 父进程从管道中分别接收两个子进程发来的消息并显示在屏 幕上,然后父进程结束。要求父进程先接受子进程p1发来的 消息,然后再接收子进程p2发来的消息。
实验六 进程间通信

预备知识
Linux进程间通信 进程软中断通信
管道和消息队列

实验指导
软中断通信函数
管道通信的使用
消息队列的应用

实验目的、内容
2.1 软中断通信函数(1)

向一个进程或一组进程发送一个信号: int kill(pid, sig)
pid>0时,核心将信号发送给进程pid
理程序
2.1 软中断通信函数(2)

pid_t wait(int * status)
暂时停止目前进程的执行,直到有信号来或子进程结束

pid_t waitpid(pid_t pid, int * status, int options)
pid的取值 pid=-1时,等待任何一个子进程退出,相当于wait() pid=0时,等待进程组ID与目前进程相同的任何子进程 pid<-1时,等待进程组ID为pid绝对值的任何子进程 options有两个常数参数,可使用或运算,不用时设为0 WNOHANG:即使没有任何子进程退出,它也会立即返回 WUNTRACED:子进程进入暂停执行状态并马上返回,但结束 状态不予以理会

实验四 进程通信实验

实验四 进程通信实验

实验四:进程通信实验实验学时:3学时一、实验目的1、熟悉操作系统进程通信原理2、设计程序,实现共享内存、管道通信、消息通信二、实验基本原理1、进程间通信的几种方法简介(1)消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。

有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

(2)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。

是针对其他通信机制运行效率较低而设计的。

往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

(3)无名管道(Pipe)及有名管道(named pipe):有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;无名管道可用于有亲缘关系的进程之间彼此的通信,进行通信时候必须有一定的机制保证对管道写和读的互斥:即在读是要关闭写的端口,而在写的时候也要保证读的一端是关闭的。

2、进程通信函数(1)消息队列有关系统调用函数a.创建消息队列使用msgget()函数:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int flag) ;该函数成功调用返回消息队列标识符。

其中的key是关键字,可以由ftok()函数得到:key=ftok(“.”,’a’);其中”.”可以是任何目录,’a’是任意字符,即所有群组标识。

flag是标识,IPC_CREAT位表示创建,一般由服务器程序创建消息队列时使用。

如果是客户程序,必须打开现存的消息队列,必须不使用IPC_CREAT。

发送和接收的消息都必须使用一个类似msgbuf的结构表示,msgbuf结构定义如下:struct msgbuf{long mtype;char mtext[1];}上面的定义,消息内容只有一个字节,是不实用的,一般我们需要重新定义一个结构:struct amsgbuf{long mtype;char mtext[200];}其中的mtype都是消息类型。

进程通信实验报告

进程通信实验报告

操作系统实验报告(三)进程通信专业:软件工程姓名:XXX班级:XXX学号:XXX指导老师:XXX2013/12/3实验三:进程通信一.实验目的加深对进程通信的理解。

熟悉消息通信机制、共享存储器通信机制,进一步认识其与信号量通信的区别。

二.实验内容1)编程实现基于消息缓冲队列机制的进程通信数据结构和通信原语(创建消息、发送消息、接收消息);2)最后编写主函数对所做工作进行测试三.实验步骤(1)任务分析:实现进程通信,需要建立创建消息函数、发送消息函数、接收消息函数,需要用到进程中的Send和Receive原语(2)程序设计:a.总体设计:创建两个windows窗体应用程序,分别用于发送消息和接收消息,可以采用C#实现。

b.具体实现①创建应用程序Sendmessage,在windows窗体上放置一个文本框输入要发送的消息,一个按钮控件,单击按钮控件发送消息,编辑ButtonOnclick()事件,来编辑发送消息函数,发送后弹出消息发送成功对话框。

②创建应用程序Receivemessage,在windows窗口上放置一个文本框用于接收消息,放置一个Button按钮,并编辑ButtonOnclick()事件,来编辑接收消息函数,成功后弹出成功接收对话框。

③程序中的发送接收需要用到系统中的函数,将在实验代码中给与提示。

(4)调试与测试实验结果:发送消息:接收消息:四.实验总结进程通信实验主要是通过通信原语机制创建消息发送函数和消息接收函数来模拟实现进程间的通信,在实验过程中,一些通信机制不是太明确,通过在网上查找资料以及和同学们交流,最终完成了进程通信实验,通过这次实验,我对进程间的通信原理多了更深一步的了解,为学习操作系统知识建立了良好的实践基础。

五.附录①发送消息函数源码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Runtime.InteropServices;namespace WindowsFormsApplication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}[DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hWnd,int Msg,int wParam,ref COPYDATASTRUCT lParam);[DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName);public struct COPYDATASTRUCT{public IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}const int WM_COPYDATA = 0x004A;private void button1_Click(object sender, EventArgs e){Sent();MessageBox.Show("信息发送成功|", "提示?", MessageBoxButtons.OK);}private void Sent(){int WINDOW_HANDLER = FindWindow(null, @"接受信息");if (WINDOW_HANDLER != 0){byte[] sarr =System.Text.Encoding.Default.GetBytes(this.textBox1.Text);int len = sarr.Length;COPYDATASTRUCT cds;cds.dwData = (IntPtr)100;cds.lpData = this.textBox1.Text;cds.cbData = len + 1;SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds); } }}}②接收消息函数源码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Runtime.InteropServices;namespace WindowsFormsApplication2{public partial class Form1 : Form{string message;public Form1(){InitializeComponent();}public struct COPYDATASTRUCT{public IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}const int WM_COPYDATA = 0x004A;private void button1_Click(object sender, EventArgs e) {Receive();}private void Receive(){textBox1.Text += "收到信息为"+ message + Environment.NewLine;MessageBox.Show("成功接收!");}protected override void DefWndProc(refSystem.Windows.Forms.Message m){switch (m.Msg){case WM_COPYDATA:COPYDATASTRUCT mystr = new COPYDATASTRUCT();Type mytype = mystr.GetType();mystr = (COPYDATASTRUCT)m.GetLParam(mytype); message = mystr.lpData;break;default:base.DefWndProc(ref m);break;}}}}。

进程之间的通信实验

进程之间的通信实验

实验:进程之间的通信管道1.Pipe函数与进程通信下面实验为使用管道进行父子进程间通信。

程序首先判断参数是否合法,因为输入的字符将从父进程通过发送到子进程中。

然后,调用pipe函数创建父子进程用于通信的管道。

使用fork函数创建子进程时,子进程会获得与父进程相同的资源,其中包括文件描述符信息。

因此,调用fork函数须在pipe函数调用前。

当父子进程通过管道进行通信时,files[1]为用于数据写入的文件描述符.因此,在子进程中,要读取管道中的数据可以调用read函数,而读取得文件描述符为files[0]。

对于父进程而言,写入数据需要调用write 函数,要写入的文件描述为files[1]。

#include <stdio.h>#include <unistd.h>int main(int argc,char* argv[]){int f_des[2];int pid;char msg[BUFSIZ];if(argc!=2){printf("Usage: %s message\n",argv[0]);return 1;}if(pipe(f_des)==-1){perror("cannot create the IPC pipe");return 1;}pid=fork();if(pid==-1){perror("cannot create new process");return 1;}else if(pid==0){close(f_des[1]);if(read(f_des[0],msg,BUFSIZ)==-1){perror("child process cannot read data from pipe");return 1;}elseprintf("in child process, receive message: %s\n",msg);_exit(0);}else {close(f_des[0]);if(write(f_des[1],argv[1],strlen(argv[1]))==-1){perror("parent process cannot write data to pipe");return 1;}elseprintf("in parent process, send message: %s\n",argv[1]);wait(NULL);_exit(0);}return 0;}2. Shell管道重订向的实现实现了在SHELL中的两个命令的组合。

操作系统实验报告 进程间通信

操作系统实验报告 进程间通信

《计算机操作系统》实验报告(二)学号:030702412 姓名:陈楠学院:数计学院专业:计算机类年级:2007级班级:4班实验时间:2009-2010学年第一学期指导教师:丁善镜、黄志华目录1、实验题目 (3)2、实验目的 (3)3、实验环境 (3)4、实验原理 (3)5、实验内容 (3)5.1、fork()函数机理探索...........................................................错误!未定义书签。

5.1.1、原始代码段................................................................错误!未定义书签。

5.1.2、代码段修改一............................................................错误!未定义书签。

5.1.3、结论(1) .......................................................................错误!未定义书签。

5.1.4、fock()函数原理...........................................................错误!未定义书签。

5.1.5、代码段修改二............................................................错误!未定义书签。

5.2、并发执行测猜测................................................................错误!未定义书签。

5.2.1、并发执行改进............................................................错误!未定义书签。

实验五_Linux进程间通信

实验五_Linux进程间通信

实验五 Linux 进程间通信1. 实验目的1)熟悉在C 语言源程序中使用Linux 所提供的系统调用界面的方法;2)掌握Linux 中子进程的创建方法以及调度执行情况,理解进程与程序的区别; 3)掌握软中断信号的使用,了解使用软中断通信实现异步事件的方法;4)掌握父子进程使用管道进行通信的方法,了解管道通信的特点和上的限制。

2. 实验内容1) 父进程创建子进程(1) 实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出1次后使用sleep(1)延时1秒,然后再进入下一循环。

(2) 在源程序中连续使用4个fork(),而不用if()进行返回值的判断,在4个fork()语言后面输出字符“A ”,观察并分析该程序编译连接执行后的输出结果。

(3) 由父进程创建一个子进程,子进程的功能史输出26个英文字母,使用execl()加载子进程的程序。

(1)(2)结果:(3)2)软中断的使用(1)编写一个程序循环显示“How are you?”,当键盘输入Ctrl+C的组合键后中断循环显示,执行软中断程序,软中断程序的功能是修改循环变量的值终止循环,然后输出“Byebye”。

输出显示结果:3)管道的使用:(1)编写一个程序,实现:父进程使用系统调用pipe()创建一个无名管道;(2)创建2个子进程,分别向管道各发下面中1条信息后结束:Child 1 is sending a message to parent!Child 2 is sending a message to parent!(1)结果:(2)输出结果:3.实验思考1)如果连续创建多个子进程而不使用条件进行各自空间的分隔,会出现什么情况?2)对实验内容2)进行改进,先输出10次“How are you?”,在此过程中使用Ctrl+C不能中断循环显示,10次以后使用Ctrl+C可以中断循环,应该做那些修改?3)管道通信与软中断通信在信息量的大小上有何区别?4)共享同一个管道进行通信的读写进程之间必须满足什么关系,为什么?。

实验三_进程间的通信

实验三_进程间的通信

本科实验报告专用纸课程名称操作系统原理成绩评定实验项目名称进程间的通信指导教师实验项目编号实验项目类型实验地点学生姓名学号学院系专业实验时间年月日上午~月日上午温度℃湿度一、实验目的和要求1.实验目的:1.学习如何利用管道机制或消息缓冲队列进行进程间的通信,并加深对上述通信机制的理解。

提高学生分析问题和解决问题的能力,并学习撰写规范的科学研究报告(论文)。

2.实验要求:了解系统pipe(),msgsnd(),msgrcv()的功能和实现过程。

二、实验原理和主要内容1.实验内容:(1)编写一段程序,使用管道来实现父子进程之间的进程通信。

子进程向父进程发送自己的进程表示符,以及某字符串。

父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。

(2)编写一段程序,使其用消息缓冲队列来实现client和server 进程之间的通信。

2.实验原理:(使用的系统调用命令说明或算法及程序详细设计)3.实验函数说明(1)包含头文件#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>(2)msgsnd()函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//将消息送入消息队列参数:msqid:消息队列的识别码。

msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下struct msgbuf {long mtype; /* 消息类型,必须> 0 */char mtext[1]; /* 消息文本*/};msgsz:消息的大小。

msgtyp:从消息队列内读取的消息形态。

如果值为零,则表示消息队列中的所有消息都会被读取。

msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。

进程控制与进程通信程序实验报告

进程控制与进程通信程序实验报告

进程控制与进程通信程序实验报告1. 背景进程控制与进程通信是操作系统的重要概念之一,它们在现代计算机系统中起到了至关重要的作用。

进程控制是指操作系统对进程的创建、执行、中止和切换等各种操作的管理和控制,进程通信则是指进程之间通过各种方式传递信息和实现协作的机制。

在本次实验中,我们需要编写一个进程控制与进程通信程序。

通过实现进程的创建、执行和中止等基本操作,并通过进程通信机制进行信息传递,实现多个进程之间的协作。

本实验将帮助我们进一步理解和掌握进程控制与进程通信的原理和操作。

2. 分析2.1 实验要求本次实验要求我们编写一个进程控制与进程通信程序,实现以下功能:1.创建一个主进程和多个子进程,并实现进程的执行和切换;2.子进程之间通过进程通信机制传递信息;3.实现多个子进程之间的协作,完成指定的任务。

2.2 系统设计为了满足实验的要求,我们可以按照以下步骤设计我们的系统:1.创建主进程和多个子进程:使用操作系统提供的进程创建函数,创建一个主进程和多个子进程。

主进程将负责协调子进程的执行和协作。

2.进程执行和切换:使用操作系统提供的进程执行和切换函数,实现进程的执行和切换操作。

主进程可以通过改变进程的状态和优先级来控制进程的执行和切换。

3.进程通信机制:使用操作系统提供的进程通信机制,如消息队列、共享内存等,实现子进程之间的信息传递。

可以定义统一的消息格式,并使用相应的函数进行消息的发送和接收。

4.进程协作:根据实验要求,设计子进程之间的协作方式。

可以使用信号量、条件变量等机制来实现多个子进程之间的同步和互斥。

2.3 实验结果实验的结果将是一个能够创建多个子进程,并通过进程通信进行协作的程序。

程序将实现以下功能:1.主进程创建多个子进程,并通过改变进程的状态和优先级来控制进程的执行;2.子进程通过进程通信机制传递信息,完成指定的任务;3.子进程之间通过协作实现同步和互斥,保证任务的正确执行。

3. 实验步骤3.1 创建进程首先,我们需要创建主进程和多个子进程。

操作系统实验报告2-进程间通信

操作系统实验报告2-进程间通信
信号本质:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。进程用kill( )向一个进程或一组进程发送一个信号;当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断
1.了解Linux中的信号,熟悉Linux系统中进程之间软中断通信的基本原理。
2.Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,学习如何利用消息缓冲队列进行进程间的通信,并加深对消息通信机制的理解。
二、实验环境(实验设备)
Windows 2000 + VMWare +RedHatLinux8
main( )
{
int p1,p2,stdout;
while((p1=fork( ))= =-1); /*创建子进程p1*/
if (p1>0)
{
while((p2=fork( ))= =-1); /*创建子进程p2*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转stop*/
signal(17,stop); /*接收到软中断信号17,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!\n");

进程通信实验报告

进程通信实验报告

进程通信实验报告进程通信实验报告概述进程通信是操作系统中非常重要的一个概念,它允许不同的进程之间进行数据的交换和共享。

在本次实验中,我们通过使用不同的进程通信机制,如管道、消息队列和共享内存,来实现进程之间的数据传输和通信。

本报告将详细介绍实验的背景、实验过程、结果分析以及对实验的总结。

实验背景进程通信是操作系统中的一个核心概念,它允许多个进程之间进行数据的交换和共享。

在现代操作系统中,进程通信是实现并发和协作的重要手段。

了解不同的进程通信机制以及它们的优缺点对于深入理解操作系统的原理和实现至关重要。

实验过程在本次实验中,我们使用了三种不同的进程通信机制:管道、消息队列和共享内存。

首先,我们创建了两个进程,一个作为发送方,一个作为接收方。

然后,我们分别使用了管道、消息队列和共享内存来实现进程之间的数据传输和通信。

管道是一种最简单的进程通信机制,它可以在父进程和子进程之间进行单向的通信。

我们通过创建一个管道,并将其连接到父进程和子进程的标准输入和标准输出,实现了父子进程之间的数据传输。

消息队列是一种更为灵活的进程通信机制,它可以实现多个进程之间的双向通信。

我们使用了系统提供的消息队列函数,创建了一个消息队列,并在发送方将消息发送到队列中,接收方则从队列中接收消息。

通过消息队列,我们实现了进程之间的异步通信。

共享内存是一种高效的进程通信机制,它允许多个进程共享同一块内存空间。

我们使用了共享内存函数,创建了一个共享内存区域,并将其映射到两个进程的虚拟地址空间中。

通过共享内存,我们实现了进程之间的数据共享和同步。

结果分析通过实验,我们发现不同的进程通信机制各有优缺点。

管道是最简单的一种机制,但只能实现单向通信,且只能用于具有亲缘关系的进程。

消息队列可以实现多个进程之间的双向通信,但消息的顺序可能会被打乱。

共享内存是最高效的一种机制,但需要额外的同步机制来保证数据的一致性。

总结进程通信是操作系统中非常重要的一个概念,它允许不同的进程之间进行数据的交换和共享。

操作系统实验报告2-进程间通信

操作系统实验报告2-进程间通信
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop); /*接收到软中断信号16,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转stop*/
waiting( );
kill(p1,16); /*向p1发软中断信号16*/
kill(p2,17); /*向p2发软中断信号17*/
wait(0); /*同步*/
wait(0);
printf("Parent process is killed!\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop); /*接收到软中断信号17,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!\n");
lockf(stdout,0,0);
4.使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制消息的发送和接收程序。
5.server.c程序后台运行,client.c程序前台运行,server.c先于client.c运行。
程序代码
#include <stdio.h>

实验三进程间通信

实验三进程间通信

实验三进程间通信班级: xxx 学号: xxx 姓名: xxx 分数:1、实验目的:Linux系统的进程通信机构(IPC)允许在任意进程间大批量的交换数据。

本实验的目的是了解和熟悉Linux支持的通信机制、共享存储区机制及信号量机制。

2、实验预备内容:阅读Linux系统的msg.c sem.c shm.c等源码文件,熟悉Linux的三种通信机制。

3、实验内容:(1)消息的创建,发送和接收(2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1k的消息发送和接收程序。

<程序设计>(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。

(2)SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。

当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。

SERVER每接收到一个消息后显示一句“(server)received”。

(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。

最后一个消息,即是SERVER端需要的结束信号。

CLIENT每发送一条信息后显示一句“(client)sent”。

(4)父进程在SERVER和CLIENT均退出后结束。

4、源代码及运行截图:#include <stdio.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform{long mtype;char mtext[1030];}msg;int msgqid,i;void CLIENT(){ int i;msgqid=msgget(MSGKEY,0777);for (i=10;i>=1;i--){msg.mtype=i;printf("(client)sent \n");msgsnd(msgqid,&msg,1024,0); /*发送消息msg入msgid消息队列*/ }}void SERVER(){msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*由关键字获得消息队列*/ do{msgrcv(msgqid,&msg,1030,0,0); /*从msgid消息队列接收消息msg*/printf("(server)received \n");}while(msg.mtype!=1); /*消息类型为1时,释放队列*/ msgctl(msgqid,IPC_RMID,0);}void main(){while((i=fork())==-1);if(!i) SERVER();while((i=fork())==-1);if(!i) CLIENT();wait(0);wait(0);}5、实验感想本次实验的实验目的是了解和熟悉Linux支持的通信机制、共享存储机制及信号量机制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

进程间通信实验报告
班级:10网工三班学生姓名:谢昊天学号:1215134046
实验目的和要求:
Linux系统的进程通信机构 (IPC) 允许在任意进程间大批量地交换数据。

本实验的目的是了解和熟悉Linux支持的消息通讯机制及信息量机制。

实验内容与分析设计:
(1)消息的创建,发送和接收。

①使用系统调用msgget (), msgsnd (), msgrev (), 及msgctl () 编制一长度为1k 的消息的发送和接收程序。

②观察上面的程序,说明控制消息队列系统调用msgctl () 在此起什么作用?
(2)共享存储区的创建、附接和段接。

使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。

(3)比较上述(1),(2)两种消息通信机制中数据传输的时间。

实验步骤与调试过程:
1.消息的创建,发送和接收:
(1)先后通过fork( )两个子进程,SERVER和CLIENT进行通信。

(2)在SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。

当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER 。

SERVER每接收到一个消息后显示一句“(server)received”。

(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。

最后的一个消息,既是 SERVER端需要的结束信号。

CLIENT每发送一条消息后显示一句“(client)sent”。

(4)父进程在 SERVER和 CLIENT均退出后结束。

2.共享存储区的创建,附接和断接:
(1)先后通过fork( )两个子进程,SERVER和CLIENT进行通信。

(2)SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1。

作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它的值设为-1.如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER.SERVER 每接收到一次数据后显示”(server)received”.
(3)CLIENT端建立一个为75的共享区,当共享取得第一个字节为-1时, Server端空闲,可发送请求. CLIENT 随即填入9到0.期间等待Server端再次空闲.进行完这些操作后, CLIENT退出. CLIENT每发送一次数据后显示”(client)sent”.
(4)父进程在SERVER和CLIENT均退出后结束。

实验结果:
1.消息的创建,发送和接收:
由 Client 发送两条消息,然后Server接收一条消息。

此后Client Server交替发送和接收消息。

最后一次接收两条消息。

Client 和Server 分别发送和接收了10条消息。

message 的传送和控制并不保证完全同步,当一个程序不再激活状态的时候,它完全可能继续睡眠,造成上面现象。

在多次send message 后才 receive message.这一点有助于理解消息转送的实现机理。

2.共享存储区的创建,附接和断接:
在运行的过程中,发现每当client发送一次数据后,server要等大约0.1秒才有响应。

同样,之后client又需要等待大约0.1秒才发送下一个数据。

出现上述的应答延迟的现象是程序设计的问题。

当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。

此时,client端并没有放弃系统的控制权,仍然占用CPU 的时间片。

只有当系统进行调度时,切换到了server进程,再进行应答。

这个问题,也同样存在于server端到client的应答过程之中。

3 比较两种消息通信机制中的数据传输的时间:
由于两种机制实现的机理和用处都不一样,难以直接进行时间上的比较。

如果比较其性能,应更加全面的分析。

(1)消息队列的建立比共享区的设立消耗的资源少.前者只是一个软件上设定的问题,后者需要对硬件操作,实现内存的映像,当然控制起来比前者复杂.如果每次都重新进行队列或共享的建立,共享区的设立没有什么优势。

(2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而消息传递,由软件进行控制和实现,需要消耗一定的CPU资源.从这个意义上讲,共享区更适合频繁和大量的数据传输。

(3)消息的传递,自身就带有同步的控制.当等到消息的时候,进程进入睡眠状态,不再消耗CPU资源.而共享队列如果不借助其他机制进行同步,接受数据的一方必须进行不断的查询,白白浪费了大量的CPU资源.可见消息方式的使用更加灵活。

疑难小结:
通过本次实验让我了解了进程间通信,message的传送和控制并不保证完全同步,当一个程序不再激活状态的时候,它完全可能继续睡眠,在多次send message 后才 receive message.这一点有助于理解消息转送的实现机理。

并且了解了只有当系统进行调度时,切换到了server进程,再进行应答。

这个问题,也同样存在于server端到client的应答过程之中。

加深了对进程概念的理解,明确进程间通信的原理,进一步认识并发执行的实质。

巩固了课本上所学到的知识。

主要算法和程序清单:
1.消息的创建,发送和接收:
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75 /*定义关键词MEGKEY*/
struct msgform /*消息结构*/
{
long mtype;
char mtexe[100]; /*文本长度*/
}msg;
int msgqid,i;
void CLIENT( )
{
int i;
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
for(i=10;i>=1;i--)
{
msg.mtype=i;
printf("(client)sent\n");
msgsnd(msgqid,&msg,1030,0); /*发送消息msg入msgid消息队列*/ }
exit(0);
}
void SERVER( )
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*由关键字获得消息队列*/
do
{
msgrcv(msgqid,&msg,1030,0,0); /*从队列msgid接受消息msg*/
printf("(server)receive\n");
}while(msg.mtype!=1); /*消息类型为1时,释放队列*/
msgctl(msgqid, IPC_RMID,0);
}
main()
{
if(fork())
{
SERVER();
wait(0);
}
else CLIENT( );
}
2.共享存储区的创建,附接和断接:
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#define SHMKEY 75 /*定义共享区关键词*/
int shmid,i;
int *addr;
CLIENT()
{
int i;
shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT); /*获取共享区,长度1024,关键词SHMKEY*/
addr=shmat(shmid,0,0); /*共享区起始地址为addr*/
for(i=9;i>=0;i--)
{
while(*addr!= -1);
printf("(client)sent\n"); /*打印(client)sent*/
*addr=i; /*把i赋给addr*/
}
exit(0);
}
SERVER()
{
do
{
while(*addr = =-1);
printf("(server)received\n%d",*addr); /*服务进程使用共享区*/
if(*addr!=0)
*addr=-1;
} while(*addr);
wait(0);
shmctl(shmid,IPC_RMID,0);
}
main()
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享区*/
addr=shmat(shmid,0,0); /*共享区起始地址为addr*/ *addr=-1;
if(fork())
{
SERVER();
}
else
{
CLIENT();
}
Welcome !!! 欢迎您的下载,资料仅供参考!。

相关文档
最新文档