sem_shm_test.c

来自「这个代码特点是由System V的IPC对象信号量和共享内存模拟了多进程间的同步」· C语言 代码 · 共 94 行

C
94
字号
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

#define KEY  0x101

int  init( void );
void  p( int semid );
void  v( int semid );

main()
{
  int  shmid, semid,i;
  int  flag=0,flag1=0; 
  pid_t pid;
  char *ptr;
  shmid = shmget( KEY, 32, IPC_CREAT|0600 );
  ptr = (char *)shmat( shmid, NULL, 0 );
  semid = init( );


  if((pid=fork())==0)
  { while(flag==0){
    p( semid );
    if(ptr[0] == 11) {
    printf( "now I can write the ptr[1]\n");
    fflush( stdout);
    ptr[1]=22;
      flag=1;
    }
    v( semid );
   }
    sleep(1);
    exit(0);
  }
  else
  { while(flag1==0){
    p( semid );
    ptr[0] = 11;
    if(ptr[1] == 22) {
       printf( "now I have checked the ptr[1]\n");
	     flag1=1;
      }
    v( semid );
   }
    sleep(1);
  }

  // 释放共享内存
  shmdt( ptr );
  shmctl( shmid, IPC_RMID, 0 );
  semctl( semid, 0,IPC_RMID, 0 );
}

void  p( int semid )
{
  struct sembuf buf;

  buf.sem_num = 0;
  buf.sem_op = -1;
  buf.sem_flg = SEM_UNDO;

  semop( semid, &buf, 1 );
}

void  v( int semid )
{
  struct sembuf buf;

  buf.sem_num = 0;
  buf.sem_op = 1;
  buf.sem_flg = SEM_UNDO;

  semop( semid, &buf, 1 );
}

int  init()
{
  int semid;
  if( (semid = semget( KEY, 1, IPC_CREAT|IPC_EXCL|0600 )) == -1 )
     semid = semget( KEY, 1, 0 );
  else
     semctl( semid, 0, SETVAL, 1 );

  return( semid );
}


⌨️ 快捷键说明

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