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

前言

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原生的多进程(`multiprocessing.Process`)在启动子进程时,是无法直接获得子进程的返回值的。这是因为进程之间是相互独立的,每个进程都有自己的内存空间,无法直接访问其他进程的内存空间。 为了解决这个问题,我们可以使用进程间通信(IPC)的方式来实现子进程向主进程返回数据。常用的 IPC 方法包括消息队列、管道、共享内存等。在 Python 中,我们可以使用 `multiprocessing` 模块提供的 `Queue` 类来实现进程间通信。 具体而言,我们可以在主进程中创建一个 `Queue` 对象,然后将这个对象传递给子进程。子进程在执行完任务后,将结果放入队列中。主进程从队列中获取结果即可。 以下是一个示例程序: ```python import multiprocessing def worker(num, queue): result = num * num queue.put(result) if __name__ == '__main__': queue = multiprocessing.Queue() processes = [] for i in range(4): p = multiprocessing.Process(target=worker, args=(i, queue)) processes.append(p) p.start() for p in processes: p.join() results = [] while not queue.empty(): result = queue.get() results.append(result) print(results) ``` 在这个示例程序中,我们创建了一个 `worker` 函数,它会计算一个数的平方,并将其放入一个队列中。我们使用 `multiprocessing.Queue` 来创建一个队列,并将其作为参数传递给 `worker` 函数。我们使用 `multiprocessing.Process` 来创建 4 个进程,并将 `worker` 函数和队列作为参数传递给它们。我们使用一个列表来存储进程对象,并在启动所有进程后,使用 `join` 方法等待所有进程完成。 当所有进程都完成后,我们从队列中获取每个进程的返回值,并将其放入一个列表中。最后,我们打印出这个列表,它应该是一个包含了每个数的平方的列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

起个网名真难~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值