C结构上的共享内存无法正常工作

时间:2018-10-01 17:55:09

标签: c struct shared-memory

我正在研究一个模拟益智游戏的小程序,可以在其中打印板的状态,或者上下左右移动,但是在尝试使用共享内存实现该程序时遇到了问题。我在具有char * [4] [4]的头文件中有一个结构 在其他两个文件中都使用了

设置就是这样

// Instance of Board for the current state of the game.
Obj obj; // is initialized but not here for sake of space and post size

struct obj *pobj;

int main()
{
    key_t key = ftok("/afs/x/y/z", 'b');
    //Make shared memory
    size_t BLOCK_SIZE = sizeof(struct Board);
    int shmid = shmget(key, BLOCK_SIZE, 0666 | IPC_CREAT);
    if (shmid == -1)
    {
        fail("Cannot create shared memory");
    }
    pobj = (Obj *) shmat(shmid, 0, 0);
    if (pobj == (struct Board *) -1)
    {
        fail("Can't map shared memory segment into address space");
    }obj
    // setting pobj values to obj values
    for(int i = 0; i < OBJ_ROWS; i++){
        for(int j = 0; j < OBJ_COLS; j++){
            pobj->field[i][j] = obj.field[i][j];
        }
    }

    //Loop through and print the values just put in, I get the correct values I put in

    shmdt( pobj );
    return 0;
}

我输入了正确的值

但是当我通过此访问

key_t key = ftok("/afs/x/y/z", 'b');
//Make shared memory
int shmid = shmget( key, BLOCK_SIZE, 0666 | IPC_CREAT );//this IPC_CREAT not needed
if( shmid == -1){
    fail( "Cannot create shared memory" );
}
pobj=  (OBJ *) shmat(shmid, 0, 0);
if(pobj == (struct Obj *) -1){
    fail( "Cannot map shared memory segment into address space" );
}
// loop through and print out values

除了

之类的垃圾值外,我什么也没得到
@ @ ▒▒▒▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒
▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒

是什么造成这些值的差异?

编辑:通过从引起问题的第二个文件中删除IPC_CREAT并将数组更改为int [4] [4]来解决此问题;

1 个答案:

答案 0 :(得分:4)

您在两个程序中都创建了一个全新的共享内存块。您想在reset.c中创建内存,并在fifteen.c中读取它。删除IPC_CREAT中的fifteen.c。您可以了解更多here,其中系统调用指定:

  

IPC_CREAT

     

创建一个新细分。如果未使用此标志,则                      shmget()将找到与key和                      检查用户是否有权访问                      段。

还有一些没有什么意义。字符串文字是数组,即指针,而您使Board只是一堆指针。您在共享内存对象中共享的唯一数据是指针,这对fifteen.c毫无帮助,fifteen.c需要查看实际的字符数据。相反,fifteen.c看到一堆指向reset.c中的字符串文字的指针。这不是特别有用,fifteen.c应该对一堆随机地址做什么? fifteen.c想查看实际的字母-可能是以null结尾的数组。您必须使您的Board对象包含一个2D字符数组数组(一定长度,例如16)。然后,您可以在文件中来回共享字符数据。