如何制作进程共享内存(c,linux)?

时间:2013-05-07 14:48:04

标签: c memory shared

我有一个用叉子潜水的过程。我需要为每个进程的计算结果创建一个内存区域(矩阵)。我怎样才能做到这一点?我试过或我可以使用的所有东西,但它不是在进程之间共享,或者我不能使用(不确定是否共享)。有人知道我能用什么?它可以是简单的,没有任何安全性。越简单越好。 我尝试了shmget,但它没有共享,我无法使用mmap来正确分配或使用它。我尝试了其他疏远的东西,但没有。有什么提示吗?

有些尝试:

segment_id = shmget(IPC_PRIVATE, (sizeof(int) * linhas_mat1 * colunas_mat2) ,  S_IRUSR|S_IWUSR);
matriz_result = (int **) shmat(segment_id, NULL, 0);

之后福克斯。每个进程通常可以使用matriz_result作为矩阵,但不共享内存。每个人都有一个像局部变量。

segment_id = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
matriz_result = mmap(NULL, (sizeof(int) * linhas_mat1 * colunas_mat2), PROT_READ | PROT_WRITE, MAP_SHARED, segment_id, 0);

用mmap尝试过这个,但我不知道它是否正确。我对这种低级编程并不擅长,我找不到任何关于如何正确使用它的好例子。

声明:

int segment_id is;
int **matriz_result;

1 个答案:

答案 0 :(得分:2)

int createMemShare(){
    //File descriptor declaration: 
    int fd;
    //We want to open the file with readwrite,create it, and empty it if it exists
    //We want the user to have permission to read and write from it
    fd = open(MEMSHARENAME, O_RDWR| O_CREAT | O_TRUNC, S_IRUSR| S_IWUSR );
    if(fd <= 0){
         puts("Failed in creating memory share .");
         return -1;
    }
    //Move the file pointer and write an empty byte, this forces the file to
    //be of the size we want it to be.
    if (lseek(fd, MEMSHARESIZE - 1, SEEK_SET) == -1) {
         puts("Failed to expand the memory share to the correct size.");
    return -1;
    }
    //Write out 1 byte as said in previous comment
    write(fd, "", 1);

    //Memory share is now set to use, send it back.
    return fd;
}

//Later on...
int memShareFD = mmap(NULL, MEMSHARESIZE, PROT_READ, MAP_SHARED, fd, 0);

//And to sync up data between the processes using it:
//The 0 will invalidate all memory so everything will be checked
msync(memshareFD,0,MS_SYNC|MS_INVALIDATE);

您可以尝试使用上述功能来创建共享内存空间。基本上你需要做的就是把它当作任何其他文件一样对待它。手册页上的代码示例非常完整,值得一看:check it out here

编辑:  使用shm_open作为评论中建议的Jens Gustedt,您可能会更好。它使用起来比使用我上面编写的函数自己制作文件更简单。