ftok:资源暂时不可用

ftok: Resource temporarily unavailable

我正在用 c 语言开发需要通过共享内存进行通信的应用程序。我需要通过我的应用程序中的某些字段生成密钥,所以我只是将它们转换为 int 并调用 ftok,但它不起作用,我不知道为什么。

导致错误的代码:

int proj_id = 3001; // it's calculated by app, basicly it just convert a few fields into unique int for example 3001
key_t key;
if((key = ftok(".", proj_id)) < 0);
{
   perror("ftok");
   return -1;
}

输出:ftok:资源暂时不可用

但我 运行 经常陷入这个问题。你知道为什么以及如何解决它吗? 提前致谢! ;)

错误检查应该是:

if ((key = ftok(".", proj_id)) == (key_t)-1) //... error

否定键可以(并且在 Linux 上)有效 (https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftok.html)。

你一定得到了一个否定键,然后 perror 只打印你拥有的最后一个(不相关的)errno,在你的情况下恰好是 EAGAIN

在大多数情况下 POSIX 规定错误时返回 -1< 0 检查就足够了(实际上生成的程序集比 == -1 检查稍微好一点),因为成功返回的值通常限于非负数。但是,有一些例外情况需要进行精确的 == -1 检查,ftok 就是其中之一。

此外,因为 KamilCuk points out, using a file path as opposed to a directory path might increase your code's portability as the posix spec for ftok 似乎有点模棱两可,关于是否允许目录路径(目录在 Unixes 下是 "files",但不清楚规范是否需要术语 "file path" 也包含目录路径)。