[r1]: / SharedMemoryCLinux / myshm.c  Maximize  Restore  History

Download this file

48 lines (40 with data), 1.6 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

struct DataExchange {
    int i1;
    int i2;
};

int main(int argc, char **argv)
{
    struct DataExchange *pRead, *pWrite;
    char sSharedMemReadName[100] = "_CODESYS_SharedMemoryTest_Write"; 
    char sSharedMemWriteName[100] = "_CODESYS_SharedMemoryTest_Read";

    int fdRead = shm_open(sSharedMemReadName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
    printf("Shared Memory Read: %s %d\n\n",sSharedMemReadName, fdRead);
    ftruncate(fdRead, sizeof(*pRead));
    pRead = mmap(0, sizeof(*pRead), PROT_READ | PROT_WRITE, MAP_SHARED, fdRead, 0);
    close(fdRead);

    int fdWrite = shm_open(sSharedMemWriteName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
    printf("Shared Memory Write: %s %d\n\n",sSharedMemWriteName, fdWrite);
    ftruncate(fdWrite, sizeof(*pWrite));
    pWrite = mmap(0, sizeof(*pWrite), PROT_READ | PROT_WRITE, MAP_SHARED, fdWrite, 0);
    close(fdWrite);

    do
    {
        sleep(1);
        printf("pRead->i1: %d pRead->i2: %d pWrite->i1: %d pWrite->i2: %d\n", 
               pRead->i1, pRead->i2, pWrite->i1, pWrite->i2);
        printf("Press 'Enter' to increment values or 'q' and then 'Enter' to quit\n");    
        pWrite->i1++;
        pWrite->i2--;     
    } while (getchar() != 'q');

    munmap(pRead, sizeof(*pRead));
    shm_unlink(sSharedMemReadName);

    munmap(pWrite, sizeof(*pWrite));
    shm_unlink(sSharedMemWriteName); 
    exit(0);
}