对 ios7 的 shm_open 调用现在导致在 O_CREAT (EPERM) 期间不允许操作

Posted

技术标签:

【中文标题】对 ios7 的 shm_open 调用现在导致在 O_CREAT (EPERM) 期间不允许操作【英文标题】:shm_open call for ios7 now results in operation not permitted during O_CREAT (EPERM) 【发布时间】:2013-09-25 11:50:35 【问题描述】:

我维护了一个 ios 应用程序的共享内存部分,该部分在最新版本之前一直运行良好。该代码不再允许我执行 O_CREAT 来初始化共享内存段。

似乎失去功能的代码与此类似:

int shm_fd;
if ((shm_fd = shm_open(SHM_PATH, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
    /** Handle failure  */
 else 
    /** Handle Success  */

这段代码 sn-p 直到最近才运行良好。现在它失败了,将 errno 设置为 EPERM。

如果它有帮助,它仍然可以在模拟器中完美运行。

其他人也失去了这种能力吗?有什么办法解决吗?

编辑 1: 如果认为无法使用我的旧方法,我想知道我可以做些什么来模拟相同的功能。它是多个应用程序之间共享数据的来源。所有知道数据的应用都可以查看和修改数据。

编辑 2: 根据developer forums,IPC 在最新版本中已被削弱。已提交错误报告,因为它也会影响进程内通信。希望这将得到解决,但与此同时,我将寻找一种方法来复制该功能。

【问题讨论】:

如果您告诉我们共享内存段的用途,人们可能会提出替代方案。 编辑了问题以提供更多信息。 【参考方案1】:

经过长时间的研究,我们放弃了挽救旧的 IPC 方法。我们的解决方法如下:

为了在我们的应用程序套件之间共享信息,我们决定使用 iOS 钥匙串。

为了让我们更轻松,我们发现有人已经将所有钥匙串功能打包到一个更易于使用的包中here。

这允许我们在应用之间发送数据,只要应用具有相同的应用标识符。

不理想,但它为我们完成了工作。

【讨论】:

【参考方案2】:

私有的,命名为 UIPasteboard 是一种替代方案。它比共享内存慢得多,但可能比钥匙串快。

【讨论】:

以上是关于对 ios7 的 shm_open 调用现在导致在 O_CREAT (EPERM) 期间不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

已使用 -L /lib -lrt -lpthread 未定义对“shm_open”的引用

ios7及更高版本导致图像图标错误

为啥使用 shm_open?

在 iOS7 中调用 stop 时 MPMoviePlayerController 崩溃

为啥我拒绝尝试 shm_open 的权限?

如何使用情节提要 iOS7 调用 viewWillAppear