操作系统课程设计 进程间通信
时间:2025-07-07
时间:2025-07-07
这个是自己做的,觉得还不错的样子呢,大家看看喜欢就下下来吧
2003级《操作系统》课程设计指导二
-----进程间通信设计
2006/6/20 沈奕鹏 管建军
一、设计目的
Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉Linux支持的消息通信机制、共享存储区机制及信息量机制。
二、设计内容
1.消息的创建,发送和接收。
①使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。
②观察上面程序,说明控制消息队列系统调用msgctl()在此起什么作用?
2.共享存储区的创建、附接和断接。
使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。
三、指导步骤
1.消息的创建、发送和接收
(任务)
使用系统调用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均退出后结束。
<程序)
/*e-2-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 mtext[l030]; /*文本长度*/
}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消息队列*/ }
exit(0);
这个是自己做的,觉得还不错的样子呢,大家看看喜欢就下下来吧
}
void SERVER()
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*由关键字获得消息队列*/ do
{
msgrcv(msgqid,&msg,1030,0,0); /*从msgqid队列接收消息msg */ printf("(server)received\n");
}while(msg.mtype!=1); /*消息类型为1时,释放队列*/
msgctl(msgqid,IPC_RMID,0);
exit(O);
}
int main()
{
while((i=fork())==-1);
if(!i)SERVER();
while((i=fork())==-1);
if(!i)CLIENT();
wait(0);
wait(0);
}
(结果)
从理想的结果来说,应当是每当Clinet发送一个消息后,Server接收该消息,Clinet再发送下一条。也就是说“(Clinet)sent"和
“(server)received"的字样应该在屏幕上交替出现。
实际的结果大多是,先由Clinet发送了两条消息,然后Server接收一条消息。此后C1inet-Server交替发送和接收消息。最后Server一次接
这个是自己做的,觉得还不错的样子呢,大家看看喜欢就下下来吧
收两条消息。Client和Server分别发送和接收了10条消息,与预期设想一致。
(分析)
message的传送和控制并不保证完全同步,当一个程序不在激活状态的时候,它完全可能继续睡眠,造成了上面的现象,在多次send message后才receive message。这一点有助于理解消息传送的实现机理。
2.共享存储区的创建,附接和断接
(任务)
使用系统调用shmget(),sgmat(),smgdt(),shmctl(),编制一个与上述相同功能的程序。
<程序设计>
(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程, SERVER和CLIENT,进行通信。
(2)SERVER端建立一个Key为75的共享区,并将第一个字节置为-1。作为数据空的标志。等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,进行处理。 然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出 SERVER。SERVER每接收到一次数据后显示“(server)received”。
(3)CLIENT端建立一个Key为75的共享区,当共享取得第一个字节为-1时,Server端空闲,可发送请求。CLIENT随即填入9到0。期间等待Server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“(client)sent"。
这个是自己做的,觉得还不错的样子呢,大家看看喜欢就下下来吧
(4)父进程在SERVER和CLIENT均退出后结束。
(程序)
/*e-2-2*/
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#define SHMKEY 75 /*定义共享区关键词*/
int shmid,i;
int *addr;
void CLIENT()
{ int i;
shmid=shmget(SHMKEY,1024,0777);/*获取共享区,长度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(O);
}
void SERVER()
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享区*/ addr=shmat(shmid,0,0); /*共享区起始地址 …… 此处隐藏:2070字,全部文档内容请下载后查看。喜欢就下载吧 ……