• 大小: 69KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签:

资源简介

开发环境为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\objects.mk
     文件         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

评论

共有 条评论

相关资源