什么会导致 gettimerid() 失败,将 errno 设置为 ENOSPC(未记录)?

What could cause gettimerid() to fail, setting errno to ENOSPC (undocumented)?

我正在使用 AIX 6.1。我正在使用(并参与开发)的程序包含对 C 库 gettimerid() 函数的调用。

我遇到的问题是 gettimerid() 呼叫可能每天一次间歇性失败,returning -1(指示错误),当我检查 errno , 已经设置为 ENOSPC (28d), 即 "No space left on device".

根据 the AIX documentationENOSPC 未显示为可能的 return 值之一,这让我对这意味着什么感到困惑。

据我所知,这不需要任何文件系统space,但我检查了未使用的文件space和文件系统的inode使用情况,这些似乎没问题有足够的可用内存,据我所知有足够的可用内存(尽管我不知道这个特定过程可能有一些限制,如果这是相关的),所以我不确定是什么导致 ENOSPCgettimerid() 调用而被 return 编辑。

示例代码:

static timer_t TimerId;

if ( ( TimerId = gettimerid(TIMEOFDAY, 0) ) < 0 )
{
  printf( "gettimerid fail [timer id=%d, errno=%d]", TimerId, errno );
}

示例输出:

gettimerid fail [timer id=-1, errno=28]

有谁知道是什么原因导致 AIX 上 gettimerid() 的 return 代码?

可能是重复获取TIMEOFDAY定时器而中间没有调用reltimerid造成的。作为导致它的例子:

 while( 1 )
 {
   timer_t TimerId;
   if( ( TimerId = gettimerid( TIMEOFDAY, 0 ) ) < 0 )
   {
     printf( "gettimerid failed: %d\n", errno );
     break;
   }
   else
     printf( "gettimerid OK: %d\n", TimerId );
 }

这个循环的输出是:

gettimerid OK: 5
gettimerid OK: 6
gettimerid OK: 7
gettimerid OK: 8
gettimerid failed: 28

哪个是未记录的 ENOSPC 错误号。