⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 share_memory.c

📁 包含操作系统原理书籍中所提到的很多方法的实现函数
💻 C
字号:

/*this program must be running under Linux*/

/*my_lock.c*/
#include	<sys/types.h>	/* basic system data types */
#include	<fcntl.h>		/* for nonblocking */
#include	<limits.h>		/* PIPE_BUF */
#include	<signal.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<sys/stat.h>	/* for S_xxx file mode constants */
#include        <unistd.h>

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#define __USE_GNU
#include <sys/sem.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <errno.h>
#define LOCK_PATH "/tmp/semlock"
#define MAX_TRIES 60
/*#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6)*/
#define SVSEM_MODE 0644

union semun {				/* define union for semctl() */
  int              val;
  struct semid_ds *buf;
  unsigned short  *array;
};

int semid,initflag=0;
struct sembuf postop,waitop;

void my_lock()
{
	int oflg,i;
	union semun arg;
	struct semid_ds seminfo;
	if (initflag==0){
		oflg=IPC_CREAT|IPC_EXCL|SVSEM_MODE;
		if((semid=semget(ftok(LOCK_PATH,0),1,oflg))>=0){
			arg.val=1;
			semctl(semid,0,SETVAL,arg);//set init value
		}else if(errno==EEXIST){
			semid=semget(ftok(LOCK_PATH,0),1,SVSEM_MODE);
			arg.buf=&seminfo;
			for(i=0;i<MAX_TRIES;i++){
				semctl(semid,0,IPC_STAT,arg);
				if(arg.buf->sem_otime!=0)
					goto init;
				sleep(1);
			}
			fprintf(stderr,"semget OK, but semaphore not initialized.\n");
			exit(1);
		}else{
			fprintf(stderr,"semget error.\n");
			exit(1);
		}    
	init:
		initflag=1;
		postop.sem_num=0;
		postop.sem_op=1;
		postop.sem_flg=SEM_UNDO;
		waitop.sem_num=0;
		waitop.sem_op=-1;
		waitop.sem_flg=SEM_UNDO;
	}
	semop(semid,&waitop,1);  
}

/*my_unlock.c*/
void my_unlock()
{
	semop(semid,&postop,1);
}


/*****************************************************/
/*share memory f5.c source file*/
/*#include <stdio.h>*/
/*#include <stdlib.h>*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define  SIZE  64*64  /*size of memory*/

int semid,initflag;
struct sembuf postop,waitop;
void my_lock();
void my_unlock();

struct shmdata{
	int type;
	int val1;
	int val2;
	};

main()
{
  int semid,shmid;
  int key;
  void *addr;
  struct shmdata *shmdata;
  key=ftok(".",100);  //ftok():use the current path and 100 to make out a key of key_t type, used by shmget()
  /*create a share memory*/
  if( (shmid=shmget(key,SIZE,IPC_CREAT|0666)) < 0 )
  {
      printf("shmget error");
      exit(1);
  }
  /*get the addres and write data to it*/
  addr=shmat(shmid,0,0);
  shmdata=(struct shmdata*)addr;
  my_lock();
  shmdata->type=1000;
  shmdata->val1=123;
  shmdata->val2=456;
  my_unlock();
  if(!fork())
  {
    for(;;){
    my_lock();
    if(shmdata->type==1000)
	{  
		shmdata->type=1001;
		shmdata->val1=456;
		shmdata->val2=123;
		my_unlock();
		exit(0);
	}
	my_unlock();
    }
  }else{
  /*the parent process read data from share memory*/
  for(;;){
	my_lock();
	if(shmdata->type==1001){
		printf("val1=%d\nval2=%d \n",shmdata->val1,shmdata->val2);
		my_unlock();
		break;
		}
	my_unlock();
	}
  }
}
/*程序在Linux下运行                                 */
/*******output:**************************************/
/****** val1=456 ************************************/
/****** val2=123 ************************************/
/****************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -