不同进程直接进行信息传递

该程序展示了如何在Linux环境中,通过创建共享内存和信号量实现不同进程之间的信息交互。一个进程写入数据到共享内存,然后使用信号量通知另一个进程可以安全地读取数据。程序涉及的关键函数包括shm_open、ftruncate、mmap、sem_open、sem_post和sem_wait。
摘要由CSDN通过智能技术生成

前言

对于不同进程进行信息交互来说有多种方式在这里使用共享内存加信号量的方式实现。
下面是一个写共享内存的程序

#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程序中,以便在使用相关实时功能时能够正确地编译和链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起个网名真难~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值