두 프로 세 스 공유 메모리, 쓰기, 읽 기

3916 단어 알고리즘
요구 사항: 생산자 프로 세 스 가 Catalan 시퀀스 를 생 성하 고 메모리 공유 대상 에 기록 합 니 다.소비자 프로 세 스 는 공유 메모리 에서 시퀀스 를 읽 고 출력 합 니 다.생산자 프로 세 스 는 명령 행 에서 Catalan 수 를 만 드 는 수 를 지정 해 야 합 니 다.예 를 들 어 명령 행 이 5 를 지정 하면 생산자 프로 세 스 가 5 개의 Catalan 수 를 생 성 한 다 는 것 을 설명 합 니 다.   2   5   14   42
다른 명령 행 창 을 열 면 새 프로 세 스 를 만 들 수 있 기 때문에 명시 적 으로 프로 세 스 를 만 들 지 않 습 니 다.
//   (write)
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX 32 
void *pAddr;
int shmId;
 
struct Msg{
  int flag;//0  ,1  
  long long content[MAX];
};                          //content: catalan    flag:           
 
void Handle(int s){
  if(s == 2)
  {
     //                  ,       shmat    (attach)        (detach)     
     shmdt(pAddr);     
     shmctl(shmId,IPC_RMID,0);  //          ,        
     exit(0);
  }
} 
 


int main(){
  int n = 0;    //Catalan    
  int i=0,j=0;
	
  
  /*
      ctrl+c           ,        、    (handle  ),  exit(0)    
     signal         signal   ,        handle    2  handle   
  */
  signal(2,Handle);

  /*
    key_t ftok(char *fname,int id)                       key_t 
      IPC   key,        。"."          ,  ftok   ,    read  
           ,   ftok       ,     key   
  */
  key_t key = ftok(".",2);
 
  /* 
           ,shmId        
     100          100  ;IPC_CREAT | IPC_EXCL | 0666 :          ,               
        -1,0666 3     ,6    110,          ,            , 
     group   ,    
  */  
  shmId = shmget(key,100,IPC_CREAT | IPC_EXCL | 0666); 

  pAddr = shmat(shmId,0,0);  //                    ,                ,        0          ,     0     
 
  if(*(int *)pAddr == -1){
    printf("shmat error!
"); exit(0); } memset(pAddr,0,100); // pAddr 100 NULL struct Msg *msg = (struct Msg *)pAddr; //msg msg->flag = 1; // while(1){ if(msg->flag == 1){// 1 , i=0; for(i=0;icontent[i]=0; // printf("The number of catalan:"); scanf("%d",&n); msg->content[0] = 1; for(j=1;jcontent[j] = msg->content[j-1]*(4*j+2)/(j+2); // Catalan msg->flag = 0;// flag 0, , } else{ sleep(1); // 1s, msg ( ) } } return 0; }

 
//   (read)
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAX 32
 
void *pAddr;
int shmId;
 
struct Msg{
  int flag;
  long long content[MAX];
};
 
int main(){
  int i=0;
  key_t key = ftok(".",2);
  shmId = shmget(key,0,0); //key writed key  ,   0         
  
  pAddr = shmat(shmId,0,0); //         
 
  if(*(int *)pAddr == -1){
    printf("shmat error!
"); exit(0); } struct Msg * msg = (struct Msg *)pAddr; while(1){ if(msg->flag == 0){// 0 , i=0; while(msg->content[i]!=0) { printf("%lld
",msg->content[i]); i++; } msg->flag = 1; } else{ sleep(1); } } return 0; }

본문 참고
참조 소스 코드  https://blog.csdn.net/qq_29762941/article/details/79985377
공유 메모리 함수 https://blog.csdn.net/guoping16/article/details/6584058
signal () 함수 https://blog.csdn.net/chenjianqi0502/article/details/78579541
shmget 의 인자https://blog.csdn.net/ec06cumt/article/details/51444961   https://blog.csdn.net/Fly_as_tadpole/article/details/81044096
ftok () 함수
https://www.cnblogs.com/joeblackzqq/archive/2011/05/31/2065161.html  https://www.cnblogs.com/HectorInsanE/archive/2011/03/17/1986859.html

좋은 웹페이지 즐겨찾기