我可以通过shmget()以不同的权利重新获得id吗?

时间:2015-02-07 17:47:56

标签: c linux ipc shared-memory

前奏

我有一个我自己的.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);

但我对此有一些疑问:

  1. 合法吗?我可以这样重拍吗?
  2. 根本没有任何意义吗?

  3. 奖金问题:将/ tmp /中的临时文件的文件名放到ftok()是否可以?

0 个答案:

没有答案