如何在共享内存中写入或读取变量?
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 = xxxxxxxx
和 logSM[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;
我的程序使用 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 = xxxxxxxx
和 logSM[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;