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

4
我正在使用AIX 6.1,我使用的程序(并参与开发)包含对C库gettimerid()函数的调用。
我遇到的问题是,gettimerid()调用开始出现间歇性故障,每天可能出现一次,返回-1(表示错误),当我检查errno时,它被设置为ENOSPC(28d),意味着“设备上没有剩余空间”。
根据AIX文档,未列出ENOSPC作为可能的返回值,这让我感到困惑。
据我所知,这不需要任何文件系统空间,但我检查了文件系统的未使用文件空间和inode使用情况,这些似乎都很好,并且据我所知,有足够的可用内存(尽管如果这与此相关,则可能存在某些限制特定进程的限制),因此我不确定什么会导致gettimerid()调用返回ENOSPC
示例代码:
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()返回此返回码可能是由什么原因引起的呢?


你的代码片段和输出不匹配。在代码中,你在printf()函数的format字符串中将最后一个字符设为[(errno=%d[),但在输出中,最后一个字符是](errno=28])。请确保输出属于你所展示的相同代码。 - H.S.
这是代码的简化版本,显然有一个打字错误。已经更正。 - Dan F
请再次检查您的AIX版本(oslevel -r或类似命令)。 - Lorinczy Zsigmond
请确保使用选项-D_THREAD_SAFE(如果必要,还需加上-pthread)编译所有内容。 - Lorinczy Zsigmond
本来想说我也遇到了同样的问题,但结果发现我和你看的是同一段代码!嗨,丹 :) - asc99c
显示剩余3条评论
1个回答

2

这可能是由于重复获取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错误码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接