Data unchanged when passing data to Python in multiprocessing shared memory

Jen Kris jenkris at tutanota.com
Tue Feb 1 15:14:31 EST 2022


I am using multiprocesssing.shared_memory to pass data between NASM and Python.  The shared memory is created in NASM before Python is called.  Python connects to the shm:  shm_00 = shared_memory.SharedMemory(name='shm_object_00',create=False).  

I have used shared memory at other points in this project to pass text data from Python back to NASM with no problems.  But now this time I need to pass a 32-bit integer (specifically 32,894) from NASM to Python. 

First I convert the integer to bytes in a C program linked into NASM:

    unsigned char bytes[4]
    unsigned long int_to_convert = 32894;

    bytes[0] = (int_to_convert >> 24) & 0xFF;
    bytes[1] = (int_to_convert >> 16) & 0xFF;
    bytes[2] = (int_to_convert >> 8) & 0xFF;
    bytes[3] = int_to_convert & 0xFF;
    memcpy(outbuf, bytes, 4);

where outbuf is a pointer to the shared memory.  On return from C to NASM, I verify that the first four bytes of the shared memory contain what I want, and they are 0, 0, -128, 126 which is binary 00000000 00000000 10000000 01111110, and that's correct (32,894). 

Next I send a message to Python through a FIFO to read the data from shared memory.  Python uses the following code to read the first four bytes of the shared memory:

        byte_val = shm_00.buf[:4]
        print(shm_00.buf[0])
        print(shm_00.buf[1])
        print(shm_00.buf[2])
        print(shm_00.buf[3])

But the bytes show as 40 39 96 96, which is exactly what the first four bytes of this shared memory contained before I called C to overwrite them with the bytes 0, 0, -128, 126.  So Python does not see the updated bytes, and naturally int.from_bytes(byte_val, "little") does not return the result I want. 

I know that Python refers to shm00.buf, using the buffer protocol.  Is that the reason that Python can't see the data that has been updated by another language? 

So my question is, how can I alter the data in shared memory in a non-Python language to pass back to Python? 

Thanks,

Jen



More information about the Python-list mailing list