我有一个我自己的.so库(让它命名为#34; lib.so"),两个使用该库的应用程序让它命名为a.out& amp ;回合。在库中我使用下一个(显示的想法,而不是确切的)代码:
int a[N];
for (i = 0; i < N; i++) a[i] = i;
据我所知,因为对于每个连接的应用程序,都会有另一组变量,因此在两个应用程序运行时,将会有两个a
变量副本。我使用一些数学公式来填充a
,它们保持不变。因此,由于N
非常大,我希望减少内存消耗,并在内存中只保留a
的一个副本。所以,我想使用共享内存机制。因为我在Linux下编写它,我想使用Unix System V。
第一个加载的应用程序必须初始化数组,所有其他连接的应用程序只会从该数组读取,所以我想给它们0444权限:
id = shmget(..., ..., 0444 | IPC_CREATE | IPC_EXCL)
但是第一个必须获得0666权限来填充数组:
id = shmget(..., ..., 0666 | IPC_CREATE | IPC_EXCL)
所以我提出了下一个代码:
if ((id = shmget(..., ..., 0444 | IPC_CREATE | IPC_EXCL)) == -1)
{
id = shmget(..., ..., 0666 | PC_CREATE);
initdata(id) // shmat inside
}
char * data = (char *)shmat(id, 0, 0);
现在我遇到了问题。如果我想在意识形态上正确,我需要从第一个副本中删除0666权利,而不是我给它0444。所以,我看到的唯一方法就是在shmget
调用后立即通过另一个initdata(id)
调用0444参数来重新调用它;
id = shmget(..., ..., 0666 | PC_CREATE);
initdata(id) // shmat inside
id = shmget(..., ..., 0444 | PC_CREATE);
但我对此有一些疑问:
奖金问题:将/ tmp /中的临时文件的文件名放到ftok()
是否可以?