Linux/Unix下多进程之间通过共享内存交替读写的例子(一)

前言:Linux/Unix系统编程中的一个重要概念是进程以及进程的通信问题。不懂进程、进程通信、共享内存的朋友请出门左传看看基本概念,这里就不再赘述。

逻辑描述:首先生成一个共享内存区域,通过fork生成1个子进程,然后父子进程交替进行读写。这里,由于没有进行同步化的处理(加锁的问题),仅仅作为展示。本来,想通过almart的信号来处理的,会修改后在下一个例子中进行展示。

代码 oss.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include<signal.h>
 
void* shmem;                      // 指向共享内存的指针
char parent_message[] = "hello";  // 父进程写的内容
char child_message[] = "goodbye"; // 子进程写的内容
 
void childReadWrite();            //子进程读写的函数
void parentReadWrite();           //父进程读写的函数
   
void* create_shared_memory(size_t size);
 
void* create_shared_memory(size_t size) {
    
    
  // 设置共享内存的读写权限
  int protection = PROT_READ | PROT_WRITE;
  int visibility = MAP_SHARED | MAP_ANONYMOUS;
  return mmap(NULL, size, protection, visibility, -1, 0);
}


void childReadWrite(){
    
    
	printf("Child read: %s\n", (char *)shmem);
    memcpy(shmem, child_message, sizeof(child_message));
    printf("Child wrote: %s\n", (char *)shmem);
}

void parentReadWrite(){
    
    
	printf("Parent read: %s\n", (char *)shmem);
    memcpy(shmem, parent_message, sizeof(parent_message));
    printf("Parent wrote: %s\n", (char *)shmem);
}




int main(int argc, char ** argv) {
    
    

  shmem = create_shared_memory(128);

  memcpy(shmem, parent_message, sizeof(parent_message));
  sleep(3);
  int pid = fork();

  //子进程
  if (pid == 0) {
    
    
 
  	childReadWrite();
  	sleep(1);
  	childReadWrite();
  	sleep(1);
  	childReadWrite();
  	sleep(1);
  	childReadWrite();
  	sleep(1);
  	childReadWrite();
  	sleep(1);
    
	//父进程
  } else {
    
    
    sleep(1);
    parentReadWrite();
    parentReadWrite();
	sleep(1);
	parentReadWrite();
  	sleep(1);
  	parentReadWrite();
  	sleep(1);
  	parentReadWrite();
  	sleep(1);
  }
  
  return 0;
}

linux 20.04,运行命令:
gcc oss.c -o oss
./oss
就可以看到结果。
在这里插入图片描述

缺陷:本例子中通过sleep实现间歇调度,没有考虑锁的问题,仅作演示使用,会有数据不一致的情况。

猜你喜欢

转载自blog.csdn.net/yaoguoxing/article/details/109217515