1.r.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define SHARE_MEMORY "test"
void error_and_die(const char *msg)
{
perror(msg);
exit(-1);
}
int main()
{
size_t region_size = sysconf(_SC_PAGE_SIZE);
char *string = "This is a test for share memory!\n";
int fd = 0;
void *ptr = NULL;
int ret = 0;
fd = shm_open(SHARE_MEMORY, O_CREAT|O_RDWR, 0666);
if(fd == -1)
{
error_and_die("shm open");
}
ret = ftruncate(fd, region_size);
if(ret)
{
error_and_die("ftruncate");
}
ptr = mmap(0, region_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED)
{
error_and_die("mmap");
}
close(fd);
printf("%s", ptr);
ret = munmap(ptr, region_size);
if(ret)
{
error_and_die("munmap");
}
ret = shm_unlink(SHARE_MEMORY);
if(ret)
{
error_and_die("unlink");
}
return 0;
}
2.w.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define SHARE_MEMORY "test"
void error_and_die(const char *msg)
{
perror(msg);
exit(-1);
}
int main()
{
size_t region_size = sysconf(_SC_PAGE_SIZE);
char *string = "This is a test for share memory!\n";
int fd = 0;
void *ptr = NULL;
int ret = 0;
fd = shm_open(SHARE_MEMORY, O_CREAT|O_TRUNC|O_RDWR, 0666);
if(fd == -1)
{
error_and_die("shm open");
}
ret = ftruncate(fd, region_size);
if(ret)
{
error_and_die("ftruncate");
}
printf("region_size=%d\n", region_size);
ptr = mmap(0, region_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED)
{
error_and_die("mmap");
}
close(fd);
memcpy(ptr, string, (strlen(string)+1));
ret = munmap(ptr, region_size);
if(ret)
{
error_and_die("munmap");
}
/*ret = shm_unlink(SHARE_MEMORY);
if(ret)
{
error_and_die("unlink");
}*/
return 0;
}
3.编译源码
$ gcc -o r r.c -lrt
$ gcc -o w w.c -lrt
4.运行及其结果
$ ./w
region_size=4096
$ ./r
This is a test for share memory!
网友评论