【问题标题】:How can I write variables in a shared-memory or read them?如何在共享内存中写入变量或读取它们?
【发布时间】:2019-01-17 08:42:21
【问题描述】:

我的程序使用 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 指向 timeLog[MAXENTRIES] 的数组,但我仍然不知道如何将整数变量写入这个数组。

标签: c linux memory semaphore shared


【解决方案1】:

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

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

所以用法应该是这样的

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

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

类似

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

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

logSM[*counter].ticks = ticks;

【讨论】:

  • 我之前尝试过使用它,但是编译器告诉我:错误 [...] 是一个指针;你的意思是使用'->'吗?
  • @Tyr 更新答案
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 2015-01-19
  • 1970-01-01
  • 2010-11-28
  • 2018-03-21
  • 2010-11-28
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多