如何在共享内存中写入或读取变量?

时间:2019-01-17 08:42:21

标签: c linux memory semaphore shared

我的程序使用fork启动子进程,以向父进程询问有关UNIX时间的信息。我已经创建了一个具有共享内存的函数,可以将刻度(UNIX-Time)和客户端编号写入具有索引MAXENTRIES的结构数组中。 我无法弄清楚为什么传递给函数f_timeLog(int,int)的值不显示在数组中。

如果我使用

打印

printf("From: %d\tTICKS: %d\n", logSM[*counter]->vonWem, logSM[*counter]->ticks);

值始终表示:0。 如果我调试程序,它将正确写入第一个值logSM [0],但不会正确写入。

感谢帮助!

typedef struct
{
    int vonWem;
    int ticks;
}timeLog [MAXENTRIES];

void f_timeLog(int who, int ticks)
{
    int *counter;
    timeLog *logSM;
    logSM = (timeLog*) shmat(TimeLog, NULL, (SHM_R|SHM_W));
    counter = (int*) shmat(IDCounter, NULL, (SHM_R|SHM_W));
    P(SemWriteLog);
    logSM[*counter]->vonWem = who;
    logSM[*counter]->ticks = ticks;
    *counter= *counter+1;
    if(*counter >= MAXENTRIES) *counter= *counter - MAXENTRIES;
    V(SemWriteLog);
}

输出为logSM [0] vonWem = X,ticks = xxxxxxxx 和logSM [1]以及进一步:vonWem = 0,ticks = 0;

1 个答案:

答案 0 :(得分:1)

logSM是指向数组的指针,而不是指针数组。

由于logSM是一个指针,我们需要取消引用它。而且因为它指向结构对象(实例)的数组,所以我们不能使用“箭头”运算符。

所以用法应该像

(*logSM)[*counter].ticks = ticks;

更自然的解决方案是将类型别名timeLog重新定义为结构本身。

类似

typedef struct
{
    int vonWem;
    int ticks;
} timeLog;

然后,您可以像使用其他任何指针或数组一样使用logSM

logSM[*counter].ticks = ticks;