前言
对于不同进程进行信息交互来说有多种方式在这里使用共享内存加信号量的方式实现。
下面是一个写共享内存的程序
#include <iostream>
#include <sys/mman.h>
#include <fcntl.h>
#include <semaphore.h>
#include <unistd.h>
#include <cstring>
using namespace std;
const char* SHM_NAME = "/myshm"; // 共享内存名称
const char* SEM_NAME = "/mysem"; // 信号量名称
const int SHM_SIZE = 4096; // 共享内存大小
int main() {
// 创建共享内存
int shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
cerr << "Failed to create shared memory" << endl;
return -1;
}
// 设置共享内存大小
ftruncate(shm_fd, SHM_SIZE);
// 映射共享内存到当前进程的地址空间
void* shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
// 创建信号量
sem_t* sem = sem_open(SEM_NAME, O_CREAT, 0666, 0);
if (sem == SEM_FAILED) {
cerr << "Failed to create semaphore" << endl;
return -1;
}
// 写入数据到共享内存中
char* data = "Hello, world!";
memcpy(shm_ptr, data, strlen(data) + 1);
// 发送信号量通知读取进程可以开始读取数据
sem_post(sem);
// 等待读取进程读取数据
sleep(100);
// 清理
// 程序通过munmap()函数和shm_unlink()函数来清理共享内存
// munmap(shm_ptr, SHM_SIZE);
// shm_unlink(SHM_NAME);
// //通过sem_close()函数和sem_unlink()函数来清理信号量
// sem_close(sem);
// sem_unlink(SEM_NAME);
return 0;
}
## 对应的cmakelist
```bash
cmake_minimum_required(VERSION 3.16)
project(test01)
set(CMAKE_CXX_STANDARD 14)
add_executable(test01 main.cpp)
target_link_libraries(test01 pthread)
target_link_libraries(test01 rt)
# 读的程序
```cpp
#include <iostream>
#include <sys/mman.h>
#include <fcntl.h>
#include <semaphore.h>
#include <cstring>
using namespace std;
const char* SHM_NAME = "/myshm";
const char* SEM_NAME = "/mysem";
const int SHM_SIZE = 4096;
int main() {
int shm_fd = shm_open(SHM_NAME, O_RDONLY, 0666);
if (shm_fd == -1) {
cerr << "Failed to open shared memory" << endl;
return -1;
}
void *shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
sem_t *sem = sem_open(SEM_NAME, O_CREAT, 0666, 0);
if (sem == SEM_FAILED) {
cerr << "Failedto create semaphore" << endl;
return -1;
}
// 等待写入进程写入数据
sem_wait(sem);
// 从共享内存中读取数据
char *data = (char *) shm_ptr;
cout << "Received data: " << data << endl;
// 清理
// munmap(shm_ptr, SHM_SIZE);
// sem_close(sem);
return 0;
}
对应的cmakelists
```cpp
cmake_minimum_required(VERSION 3.16)
project(test02)
set(CMAKE_CXX_STANDARD 14)
add_executable(test02 main.cpp)
target_link_libraries(test02 pthread)
target_link_libraries(test02 rt)
RT是Linux系统提供的一个实时库,包含了一些用于实现实时应用程序的函数和数据结构。这个库提供了定时器、线程间同步、内存锁定、进程间通信等实时相关的功能。在CMake中使用target_link_libraries(test02 rt)命令将librt库链接到test02程序中,以便在使用相关实时功能时能够正确地编译和链接。