前言: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实现间歇调度,没有考虑锁的问题,仅作演示使用,会有数据不一致的情况。
