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

How can I write variables in a shared-memory or read them?

我的程序使用 fork 启动子进程,以询问父进程有关 UNIX 时间的信息。我创建了一个具有共享内存的函数,用于将 Ticks (UNIX-Time) 和 Client-Number 写入具有 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 = xxxxxxxxlogSM[1] and further: vonWem = 0, ticks = 0;

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

因为logSM是一个指针,我们需要解引用它。因为它指向结构对象(实例)数组,所以我们不能使用 "arrow" 运算符。

所以用法应该像

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

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

所以像

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

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

logSM[*counter].ticks = ticks;