当写入linux上的映射内存时,mmap的共享内存返回

时间:2012-10-16 14:03:40

标签: c linux shared-memory mmap

我试图找出共享内存并尝试编写一个涉及消费者和制作人的简单程序。我没有把它带到消费者的一部分,发现这个奇怪的小问题:父母将在*spool=3;返回没有押韵或原因。 dmesg上没有任何内容。

#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define PRODUCER_ERROR(msg)         \
    do {perror("Producer Error: " msg "\n"); exit(1); }while(0)

#define SHM_NAME "/my_sharedmem"

void producer();

int main(int argc, char *argv[])
{
    pid_t pID = fork();
    if (pID == 0) {
    // Code only executed by child process
    printf ("Son here\n");
    return 0;
    } else if (pID < 0) {
    perror("Unable to fork\n");
    exit(1);
    } else {
    // Code only executed by parent process
    printf ("Parent here\n");
        producer();
    return 0;
    }

    return 0;
}


void producer()
{
    int fd, d;
    unsigned* spool;

    printf("<<Producer>> started\n");
    fd = shm_open(SHM_NAME, O_CREAT | O_RDWR,  S_IRWXU | S_IRWXG | S_IRWXO ); // FIXED

    printf ("<<Producer>> memory file opened\n");

    spool = mmap(NULL, sizeof(unsigned), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, fd, 0);
    printf ("<<Producer>> mmaped to %p\n\tGonna write.\n", spool);
    perror(NULL);

    *spool = 3;
    // msync(spool, sizeof(unsigned), MS_SYNC | MS_INVALIDATE);

    printf("<<Producer>> ended\n");
}

编辑:修复了shm_open模式参数

2 个答案:

答案 0 :(得分:3)

使用shm_open获得的对象是零大小。你需要为它分配一些空间。 mmap将允许您映射超出其大小的内容(shm对象和文件),但是当您访问该内存时,您将崩溃。

shm_open之后是你想做的事情:

ftruncate(fd, <the size you want>);

你也可以在mmap之后做,如果它漂浮在你的船上。

答案 1 :(得分:1)

你有shm_open的模式参数错误。这应该是open的模式规范。可能你的版本在这里通过巧合禁止写入地址,所以当你尝试写入它时,进程会崩溃。

BTW:你应该经常检查库调用的返回,例如shm_openmmap

编辑:正如我在下面的评论中所观察到的那样,您也缺少使用ftruncate将细分受众群缩放到合适的尺寸。