os2.2共享内存进程通讯

#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <wait.h>
#define SHMKEY 75
using namespace std;
int  shmid,i;
int  *addr;

void client(){
    shmid = shmget(SHMKEY,1024,0777);//打开共享存储区
    //第一次创建完共享内存时,它还不能被任何进程访问,shmat()函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
    //addr为共享内存的首地址
    addr = static_cast<int *>(shmat(shmid, nullptr, 0));//启用存储区,第二个参数为让系统自动选择共享存储区的地址
    for (i = 9; i >= 0; i--)
    {
        while (*addr != -1);//*addr == -1表示server已经阻塞,client这时执行post操作
        printf("(client) client pid=%d post at address%d\n",getpid(),*addr);
        *addr = i;
    }
    exit(0);
}
void server(){
    shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);
    addr = static_cast<int *>(shmat(shmid, nullptr, 0));
    do
    {
        *addr = -1;
        while(*addr == -1);//*addr == -1表示client正在执行post操作,需要等待
        printf("(server) server pid=%d read at address%d\n",getpid(),*addr);
    }while(*addr);
    shmctl(shmid,IPC_RMID,nullptr);//撤消共享存储区,归还资源
    exit(0);
}
int main(){
    while ((i = fork()) == -1);
    if(!i){server();}
    system("ipcs  -m");
    while ((i = fork()) == -1);
    if(!i){client();}
    wait(nullptr);
    wait(nullptr);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中提供了多种方式实现共享内存通讯,其中比较常用的有以下几种: 1. multiprocessing模块中的共享内存 multiprocessing模块中提供了一些类似于Unix中共享内存的机制,如Value和Array。Value和Array都是用来在多进程间共享数据的对象,Value是用于表示单一的值,而Array则是用于表示一组值(如数组)。这两种对象的使用方法类似,可以通过get()和set()方法来获取和设置值。 示例代码: ``` from multiprocessing import Process, Value, Array def f(n, a): n.value = 3.1415926 for i in range(len(a)): a[i] *= -1 if __name__ == '__main__': num = Value('d', 0.0) arr = Array('i', range(10)) p = Process(target=f, args=(num, arr)) p.start() p.join() print(num.value) print(arr[:]) ``` 2. mmap模块 mmap模块是Python中的一个标准库,它提供了一种将文件映射到内存的方式,可以实现多进程之间的共享内存。通过mmap映射文件,多个进程就可以同时访问同一块内存。 示例代码: ``` import mmap import os with open("test.txt", "rb+") as f: mm = mmap.mmap(f.fileno(), 0) pid = os.fork() if pid == 0: # 子进程 mm[0] = 'c' mm.flush() mm.close() else: # 父进程 mm[0] = 'p' mm.flush() os.waitpid(pid, 0) print(mm[:]) mm.close() ``` 3. ctypes模块 ctypes模块是Python中的一个标准库,它提供了一种将C语言函数库中的函数映射到Python中的方式,可以实现多进程之间的共享内存。ctypes模块中提供了一些共享内存相关的函数,例如mmap、shmget等。 示例代码: ``` import ctypes libc = ctypes.CDLL(None) shmget = libc.shmget shmat = libc.shmat shmdt = libc.shmdt key = 1234 size = 1024 # 创建共享内存 shmid = shmget(key, size, 0o666 | 0o2000) # 将共享内存映射到进程的地址空间 addr = shmat(shmid, 0, 0) # 写入数据 ctypes.memset(addr, ord('A'), size) # 解除映射 shmdt(addr) # 重新映射 addr = shmat(shmid, 0, 0) # 读取数据 print(ctypes.string_at(addr, size)) # 解除映射 shmdt(addr) ``` 以上是几种常用的Python共享内存通讯方式,使用时需要根据实际情况选择合适的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值