semaphore로 process간 데이터를 주고 받을 줄 알았는데, 아니었다. semaphore로 동기하고 process간 데이터 전달은 메모리 공유로 한다.
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/stat.h> #include <fcntl.h> #include <semaphore.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> #define SEM_NAME "mysem" #define FILE_MODE 0666 struct shared{ sem_t mutex; int count; } shared; int main(int argc, char **argv) { int fd, i, nloop, zero = 0; //int *ptr; //sem_t *mutex; struct shared *ptr; if (argc != 3) perror("usage: incr2 <pathname> <#loops>"); nloop = atoi(argv[2]); /* 4open file, initialize to 0, map into memory */ fd = open(argv[1], O_RDWR | O_CREAT, FILE_MODE); write(fd, &shared, sizeof(struct shared)); ptr = mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); /* 4create, initialize, and unlink semaphore */ //mutex = sem_open(SEM_NAME, O_CREAT | O_EXCL, FILE_MODE, 1); sem_init(&ptr->mutex,1,1); sem_unlink(SEM_NAME); setbuf(stdout, NULL); /* stdout is unbuffered */ if (fork() == 0) { /* child */ for (i = 0; i < nloop; i++) { sem_wait(&ptr->mutex); printf("child: %d\n", (ptr->count)++); sem_post(&ptr->mutex); } exit(0); } /* 4parent */ for (i = 0; i < nloop; i++) { sem_wait(&ptr->mutex); printf("parent: %d\n", ptr->count++); sem_post(&ptr->mutex); } exit(0); }
pi@raspberrypi:~/Project/cCode/IPC $ ./a.out tt 100 parent: 0 parent: 1 parent: 2 parent: 3 parent: 4 parent: 5 child: 6 child: 7 child: 8 child: 9 child: 10 child: 11 child: 12 child: 13 child: 14 child: 15 child: 16 child: 17 child: 18 child: 19 child: 20 child: 21 child: 22 child: 23 child: 24 child: 25 child: 26 child: 27 child: 28 child: 29 child: 30 child: 31 child: 32 child: 33 child: 34 child: 35 child: 36 child: 37 child: 38 child: 39 child: 40 child: 41 child: 42 child: 43 child: 44 child: 45 child: 46 child: 47 child: 48 child: 49 child: 50 child: 51 child: 52 child: 53 child: 54 child: 55 child: 56 child: 57 child: 58 child: 59 child: 60 child: 61 child: 62 child: 63 child: 64 child: 65 child: 66 child: 67 child: 68 child: 69 child: 70 child: 71 child: 72 child: 73 child: 74 child: 75 child: 76 child: 77 child: 78 child: 79 child: 80 child: 81 child: 82 child: 83 child: 84 child: 85 child: 86 child: 87 child: 88 child: 89 child: 90 child: 91 child: 92 child: 93 child: 94 child: 95 child: 96 child: 97 child: 98 child: 99 child: 100 child: 101 child: 102 child: 103 child: 104 child: 105 parent: 106 parent: 107 parent: 108 parent: 109 parent: 110 parent: 111 parent: 112 parent: 113 parent: 114 parent: 115 parent: 116 parent: 117 parent: 118 parent: 119 parent: 120 parent: 121 parent: 122 parent: 123 parent: 124 parent: 125 parent: 126 parent: 127 parent: 128 parent: 129 parent: 130 parent: 131 parent: 132 parent: 133 parent: 134 parent: 135 parent: 136 parent: 137 parent: 138 parent: 139 parent: 140 parent: 141 parent: 142 parent: 143 parent: 144 parent: 145 parent: 146 parent: 147 parent: 148 parent: 149 parent: 150 parent: 151 parent: 152 parent: 153 parent: 154 parent: 155 parent: 156 parent: 157 parent: 158 parent: 159 parent: 160 parent: 161 parent: 162 parent: 163 parent: 164 parent: 165 parent: 166 parent: 167 parent: 168 parent: 169 parent: 170 parent: 171 parent: 172 parent: 173 parent: 174 parent: 175 parent: 176 parent: 177 parent: 178 parent: 179 parent: 180 parent: 181 parent: 182 parent: 183 parent: 184 parent: 185 parent: 186 parent: 187 parent: 188 parent: 189 parent: 190 parent: 191 parent: 192 parent: 193 parent: 194 parent: 195 parent: 196 parent: 197 parent: 198 parent: 199 pi@raspberrypi:~/Project/cCode/IPC $ od -A d -t d tt 0000000 2 128 0 0 0000016 200 000002