美文网首页
linux c POSIX共享内存示例

linux c POSIX共享内存示例

作者: 一路向后 | 来源:发表于2021-08-31 21:09 被阅读0次

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!

相关文章

网友评论

      本文标题:linux c POSIX共享内存示例

      本文链接:https://www.haomeiwen.com/subject/ssctwltx.html