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