python 读取共享内存

摘要:
测试环境centos7python3.6.5首先使用c创建内存,这里的方法是:作为参数读一个二进制数据文件进去,把文件的内容作为共享内存的内容定义块#include#include#includeintmain(intargc,char*argv[]){intid=0;char*data=NULL;FILE*fp=NULL;inttotl

测试环境 centos7 python3.6.5

首先使用c创建内存,这里的方法是:作为参数读一个二进制数据文件进去,把文件的内容作为共享内存的内容

定义块

#include <stdio.h>#include <sys/shm.h>#include <string.h>

int main(int argc, char *argv[])
{
    int        id = 0;
    char    *data =NULL;
    FILE    *fp =NULL;
    int        totle_len = 0;
    int        len = 0;
    char    buf[1024] = {0};
    
    if (argc < 2)
    {
        printf("args too less
");
        return 0;
    }
    
    id = shmget(123559, 21 * 1024 * 1024, IPC_CREAT | 0777);
    if (id < 0)
    {
        printf("get id failed
");
        return 0;
    }
    
    data = shmat(id, NULL, 0);
    if (data ==NULL)
    {
        printf("shamt failed
");
        return 0;
    }
    
    fp = fopen(argv[1], "rb");
    if (fp ==NULL)
    {
        printf("open %s failed
", argv[1]);
        return 0;
    }
    
    while (totle_len <= 12 + 20 * 1024 * 1024)
    {
        len = fread(buf, 1, 1024, fp);
        if (len <= 0)
        {
            break;
        }
        memcpy(data +totle_len, buf, len);
        totle_len +=len;
    }

fclose(fp);    
    return 0;
}

使用python读取:

from ctypes import *  
importnumpy as npimportcodecs
importdatetime

SHM_SIZE = 1024*1024*20SHM_KEY = 123559OUTFILE="httpd_cdorked_config.bin"  
try:  
    rt = CDLL('librt.so')  
except:  
    rt = CDLL('librt.so.1')  
shmget =rt.shmget  
shmget.argtypes =[c_int, c_size_t, c_int]  
shmget.restype =c_int  
shmat =rt.shmat  
shmat.argtypes =[c_int, POINTER(c_void_p), c_int]  
shmat.restype =c_void_p  
     
shmid =shmget(SHM_KEY, SHM_SIZE, 0o666)
if shmid <0:  
    print ("System not infected")  
else:   
    begin_time=datetime.datetime.now()
    addr =shmat(shmid, None, 0)  
    f=open(OUTFILE, 'wb')
    rate=int.from_bytes(string_at(addr,4), byteorder='little', signed=True)   #这里数据文件是小端int16类型
    len_a=int.from_bytes(string_at(addr+4,4), byteorder='little', signed=True)   
    len_b=int.from_bytes(string_at(addr+8,4), byteorder='little', signed=True)
    print(rate,len_a,len_b)
    f.write(string_at(addr+12,SHM_SIZE))
    f.close()  #print ("Dumped %d bytes in %s" % (SHM_SIZE, OUTFILE))
print("Success!",datetime.datetime.now()-begin_time)

块的大小和块号可以设置,注意读取的时候 二进制文件的数据格式要保持一致否则读不出来正确的东西

免责声明:文章转载自《python 读取共享内存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker容器以非root用户启动应用go 计算 MD5下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 安装 pip ,并使用pip 安装 filetype

闲话少说,直接上操作。 python版本为2.7.6 可以直接到官网下载,我也提供一个百度云的下载地址https://pan.baidu.com/s/1kWPXG8Z 这个是window版本,linux版本的自行到其他地方下载。 开发工具我使用的是pycharm4.5.3,目前有破解版本,下载地址https://pan.baidu.com/s/1pMU9o...

Java调用Python脚本并获取返回值

在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError。在这种情况下可以采用另一种方法:使用Java的Runtime,像在命令行直接调用python脚本那样调用python程序。此时可以通过文件作为脚本参数来传递Py...

Python 2.6.6升级到Python2.7.15

最近在使用Python处理MySQL数据库相关问题时,需要用到Python2.7.5及以上版本,而centos6.5等版本操作系统默认自带的版本为2.6.6,因此需要对python进行升级。 Python升级的步骤大致分为如下步骤: 安装依赖包 下载安装包并上传至操作系统,下载路径 解压、编译、安装 配置相关路径下的python命令 修改yum启动路径...

Python的魔法函数

概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python #-*- coding: utf-8 -*- #Author: rex.cheny #E-mail: rex.cheny@outlook.com #类名后面写(object...

mayavi安装

Mayavi是python的一个包,提供方便的可视化方案。目前(20150809)Mayavi还没有py3的支持,以下安装环境在python 2.7.10下进行 安装Mayavi: 1. 通过pip install mayavi自动检测并且安装大部分的依赖包:     apptools、traits、traitsui、configobj、pyface、si...

pycharm解释器的配置等

转自:http://www.360doc.com/content/18/0913/14/11881101_786350505.shtml 为什么安装python后,还需要pycharm配置环境 我们实际工作中使用python,往往不同项目会用到不同的Python版本和同一个包的不同版本,比较头疼一点是包管理和Python不同版本的切换问题。为了解决这些问...