1、实验代码
shm_write.c
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define SHM_NAME "/shm"
int main (void)
{
int shm_fd;
shm_fd = shm_open (SHM_NAME, O_RDWR | O_CREAT, 0666);
if (shm_fd < 0)
{
perror ("shm_open");
return -1;
}
ftruncate (shm_fd, 8192);
struct stat filestat;
fstat (shm_fd, &filestat);
printf ("st_size: %ld\n", filestat.st_size);
char *shm_ptr;
shm_ptr = (char*)mmap (NULL, filestat.st_size, \
PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
close (shm_fd);
char buf[] = "hello world";
memmove (shm_ptr, buf, sizeof (buf));
printf ("pid %d: %s\n", getpid(), shm_ptr);
munmap (shm_ptr, filestat.st_size);
return 0;
}
shm_read.c
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define SHM_NAME "/shm"
int main (void)
{
int shm_fd;
shm_fd = shm_open (SHM_NAME, O_RDWR | O_CREAT, 0);
if (shm_fd < 0)
{
perror ("shm_open");
return -1;
}
ftruncate (shm_fd, 8192);
struct stat filestat;
fstat (shm_fd, &filestat);
printf ("st_size: %ld\n", filestat.st_size);
char *shm_ptr;
shm_ptr = (char*)mmap (NULL, filestat.st_size, \
PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
close (shm_fd);
printf ("pid %d: %s\n", getpid(), shm_ptr);
munmap (shm_ptr, filestat.st_size);
shm_unlink (SHM_NAME);
return 0;
}
2、实验结果
共享内存和信号量同时使用用来同步
read.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define SHM_NAME "/memmap"
#define SEM_NAME "/memmap_sem"
int main (void)
{
int shm_fd;
sem_t *sem;
shm_fd = shm_open (SHM_NAME, O_RDWR|O_CREAT, 0666);
sem = sem_open (SEM_NAME, 0);
if (shm_fd < 0 || sem == SEM_FAILED)
{
perror ("open");
return -1;
}
ftruncate (shm_fd, 8192);
struct stat filestat;
fstat (shm_fd, &filestat);
printf ("st_size: %ld\n", filestat.st_size);
char *shm_ptr;
shm_ptr = (char*)mmap (NULL, filestat.st_size, PROT_READ|PROT_WRITE, \
MAP_SHARED, shm_fd, 0);
if (shm_ptr ==(void*)-1)
{
perror ("mmap");
exit (-1);
}
close (shm_fd);
sem_wait (sem);
printf ("pid %d: %s\n", getpid(), shm_ptr);
sem_close (sem);
munmap (shm_ptr, 8192);
shm_unlink (SHM_NAME);
sem_unlink (SEM_NAME);
return 0;
}
write.c
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define SHM_NAME "/memmap"
#define SEM_NAME "/memmap_sem"
int main (void)
{
int shm_fd;
sem_t *sem;
shm_fd = shm_open (SHM_NAME, O_RDWR | O_CREAT, 0666);
sem = sem_open (SEM_NAME, O_CREAT, 0666, 0);
if (shm_fd < 0 || sem == SEM_FAILED)
{
perror ("open");
return -1;
}
ftruncate (shm_fd, 8192);
struct stat filestat;
fstat (shm_fd, &filestat);
printf ("st_size: %ld\n", filestat.st_size);
char *shm_ptr;
shm_ptr = (char*)mmap (NULL, filestat.st_size, \
PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
close (shm_fd);
char msg[] = "hello world";
memmove (shm_ptr, msg, sizeof (msg));
printf ("pid %d: %s\n", getpid(), shm_ptr);
sem_post (sem);
sem_close (sem);
sleep (5);
munmap (shm_ptr, 8192);
return 0;
}
实验结果: