- #include <stdio.h>
- #include <string.h>
- #include <semaphore.h>
- #include <sys/shm.h>
- #include <unistd.h>
- #include <fcntl.h>
- #define BUFFER_SIZE 4
- int main()
- {
- int shmid = shmget((key_t)1234, sizeof(int) * BUFFER_SIZE, 0644 | IPC_CREAT);
- if ( -1 == shmid )
- {
- printf("shmget failed!\n");
- return 0;
- }
- void *shm = shmat(shmid, NULL, 0);
- if ((void *)-1 == shm)
- {
- printf("shmat failed!\n");
- return 0;
- }
- int *sharedbuffer = (int *)shm;
- memset(sharedbuffer, -1, sizeof(int) * BUFFER_SIZE);
- int index = 0;
- while (index <= 20)
- {
- for (int i = 0; i < 4; i++)
- {
- if (-1 == sharedbuffer[i])
- {
- sharedbuffer[i] = ++index;
- printf("product: %d\n", sharedbuffer[i]);
- break;
- }
- }
- }
- if (-1 == shmdt((void *)sharedbuffer))
- {
- printf("shmdt failed!\n");
- }
- }
- #include <stdio.h>
- #include <string.h>
- #include <semaphore.h>
- #include <sys/shm.h>
- #include <unistd.h>
- #include <fcntl.h>
- #define BUFFER_SIZE 4
- int main()
- {
- int shmid = shmget((key_t)1234, sizeof(int) * BUFFER_SIZE, 0644 | IPC_CREAT);
- if ( -1 == shmid )
- {
- printf("shmget failed!\n");
- return 0;
- }
- void *shm = shmat(shmid, NULL, 0);
- if ((void *)-1 == shm)
- {
- printf("shmat failed!\n");
- return 0;
- }
- int *sharedbuffer = (int *)shm;
- int run = 1;
- while (run)
- {
- for (int i = 0; i < 4; i++)
- {
- if (-1 != sharedbuffer[i])
- {
- printf("consumer: %d\n", sharedbuffer[i] );
- if ( 20 == sharedbuffer[i] )
- {
- run = 0;
- }
- sharedbuffer[i] = -1;
- break;
- }
- }
- }
- if (-1 == shmdt((void *)sharedbuffer))
- {
- printf("shmdt failed!\n");
- }
- }