a | b/SharedMemoryCLinux/myshm.c | ||
---|---|---|---|
1 | #include <stdio.h> |
||
2 | #include <stdlib.h> |
||
3 | #include <sys/mman.h> |
||
4 | #include <sys/stat.h> |
||
5 | #include <fcntl.h> |
||
6 | #include <string.h> |
||
7 | |||
8 | struct DataExchange { |
||
9 | int i1; |
||
10 | int i2; |
||
11 | }; |
||
12 | |||
13 | int main(int argc, char **argv) |
||
14 | { |
||
15 | struct DataExchange *pRead, *pWrite; |
||
16 | char sSharedMemReadName[100] = "_CODESYS_SharedMemoryTest_Write"; |
||
17 | char sSharedMemWriteName[100] = "_CODESYS_SharedMemoryTest_Read"; |
||
18 | |||
19 | int fdRead = shm_open(sSharedMemReadName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG); |
||
20 | printf("Shared Memory Read: %s %d\n\n",sSharedMemReadName, fdRead); |
||
21 | ftruncate(fdRead, sizeof(*pRead)); |
||
22 | pRead = mmap(0, sizeof(*pRead), PROT_READ | PROT_WRITE, MAP_SHARED, fdRead, 0); |
||
23 | close(fdRead); |
||
24 | |||
25 | int fdWrite = shm_open(sSharedMemWriteName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG); |
||
26 | printf("Shared Memory Write: %s %d\n\n",sSharedMemWriteName, fdWrite); |
||
27 | ftruncate(fdWrite, sizeof(*pWrite)); |
||
28 | pWrite = mmap(0, sizeof(*pWrite), PROT_READ | PROT_WRITE, MAP_SHARED, fdWrite, 0); |
||
29 | close(fdWrite); |
||
30 | |||
31 | do |
||
32 | { |
||
33 | sleep(1); |
||
34 | printf("pRead->i1: %d pRead->i2: %d pWrite->i1: %d pWrite->i2: %d\n", |
||
35 | pRead->i1, pRead->i2, pWrite->i1, pWrite->i2); |
||
36 | printf("Press 'Enter' to increment values or 'q' and then 'Enter' to quit\n"); |
||
37 | pWrite->i1++; |
||
38 | pWrite->i2--; |
||
39 | } while (getchar() != 'q'); |
||
40 | |||
41 | munmap(pRead, sizeof(*pRead)); |
||
42 | shm_unlink(sSharedMemReadName); |
||
43 | |||
44 | munmap(pWrite, sizeof(*pWrite)); |
||
45 | shm_unlink(sSharedMemWriteName); |
||
46 | exit(0); |
||
47 | } |