资源简介
开发环境为eclipse+cdt插件, 用消息与共享内存实现信号量的控制
设计内容
要求产生3个进程:
1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区…”;当时间结束,显示:“进程x退出临界区…”,同时向管理进程提出退出申请;当申请返回,显示:“进程x已退出临界区。”
2、一个进程作为原语的管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;
3、对临界区的访
代码片段和文件信息
/*
============================================================================
Name : OSP.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C Ansi-style
============================================================================
*/
#include
#include
#include
#include
#include
#include
#include
#include “ran.h“
#define MSGKEY 898989
//临界区
struct crform
{
int sem; //临界区的信号量值sem
int head; //临界区等待队列的头,指向的是最先到的进程
int tail; //临界区等待队列的尾,指向的是进入等待队列的进程
int duilie[20]; //存放的是等待的进程的信息,以便唤醒
}cr;
//消息队列:
struct msgform
{
long msgtype; //消息的类型,在取消息队列时用于区分哪些是该取的信息
int mtext; //信息的内容,在这里是申请|退出进程的信息
};
void into();
void out();
int main(void) {
/*************************************************************************************************************/
puts(“***********************提示信息***********************\n“);
puts(“在程序运行过程中:\n“);
puts(“-------输入 0 继续运行程序\n“);
puts(“-------输入 1 暂停运行程序\n“);
puts(“-------输入 2 退出程序\n“);
puts(“*****************************************************\n“);
/************************************************************************************************************/
int ppid=getpid();
printf(“控制进程ID:%d\n“ppid);
/*************************************************************************************************************/
cr.sem = 1; //初始临界区信号量必须为一,因为只允许一个进程进入临界区
cr.head=0; //初始时指向等待队列的第一个单元
cr.tail=0;
//共享内存结构体
struct ShMe{
int num;
int flags;
int p1;
int p2;
};
/*创建共享内存的IPC*/
int shmid=shmget(IPC_PRIVATE10240666|IPC_CREAT);
if(shmid==-1){
printf(“共享内存区创建错误-----\n“);
exit(0);
}
pid_t id = fork();
if (id<0) {
printf(“新进程创建错误!! 2秒后自动退出。。。。。\n“);
sleep(2);
exit(0);
}else if (id==0) {
// printf(“01 i‘m in new process my id is %d \n“ getpid());
pid_t id2 = fork();
if(id2<0){
printf(“新进程创建错误!! 2秒后自动退出。。。。。\n“);
sleep(2);
exit(0);
}else if (id2==0) {
// printf(“02 i‘m in new process my id is %d \n“ getpid());
/*设置进程1,循环访问临界区*/
//
//
//
//**************************************************************************************************************************
struct msgform msg;
key_t hh=ftok(“OSP.c“1);
int msgqid=msgget(hh0666|IPC_CREAT);
struct ShMe * addr;
addr=(struct ShMe*)shmat(shmid00);
if(addr==(struct ShMe*)-1)
printf(“映射内存错误1------\n“);
/*从共享内存读出数据*/
int flags=0;
flags=addr->flags;
(*addr).p1=getpid();
printf(“进程1 ID:%d\n“getpid());
while(flags==1||flags==0){
if(flags==0){
//******************************
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2011-12-20 13:30 OSP\
文件 31338 2011-12-19 09:38 OSP\.cproject
文件 2378 2011-12-20 13:29 OSP\.project
目录 0 2011-12-20 13:24 OSP\Debug\
文件 80030 2011-12-20 13:24 OSP\Debug\OSP
文件 971 2011-12-20 13:24 OSP\Debug\makefile
文件 227 2011-12-20 12:41 OSP\Debug\ob
文件 389 2011-12-20 13:24 OSP\Debug\sources.mk
目录 0 2011-12-20 13:24 OSP\Debug\src\
文件 52 2011-12-20 13:24 OSP\Debug\src\OSP.d
文件 56600 2011-12-20 13:24 OSP\Debug\src\OSP.o
文件 60 2011-12-01 20:13 OSP\Debug\src\pandv.d
文件 8104 2011-12-01 20:13 OSP\Debug\src\pandv.o
文件 24 2011-12-20 09:27 OSP\Debug\src\ran.d
文件 21628 2011-12-20 09:27 OSP\Debug\src\ran.o
文件 714 2011-12-20 13:24 OSP\Debug\src\subdir.mk
文件 48 2011-12-02 11:08 OSP\Debug\src\tp.d
文件 15288 2011-12-02 11:08 OSP\Debug\src\tp.o
目录 0 2011-12-20 12:33 OSP\src\
文件 16198 2011-12-20 13:24 OSP\src\OSP.c
文件 307 2011-12-01 21:46 OSP\src\ran.c
文件 134 2011-12-01 21:46 OSP\src\ran.h
- 上一篇:贝叶斯在信号检测中的应用
- 下一篇:FCM算法及其推导过程
评论
共有 条评论