所有, 我尝试将计时器 ID 放入处理程序中,“人信号”告诉我:
siginfo_t {
// ...
int si_overrun; /* Timer overrun count; */
int si_timerid; /* Timer ID; POSIX.1b timers */
// ....
}
好的,但是运行时我有 si_timerid = 0 !成功运行timer_create()函数。 有趣...接下来展开 - 检查这个结构的定义。 'signal.h'包含'siginfo.h',其中存在定义,并且siginfo_t没有si_timerid,但有定义
#define si_timerid _sifields._timer.si_tid
siginfo_t 与一些匿名结构有联合,包括带有树字段的“_timer”,第三个也是联合。将尝试检查它!
printf("$%08X ", s_info -> _sifields._timer.si_tid ); //
printf("=%08X ", s_info->si_timerid );
printf("$%08X ", s_info->_sifields._timer.si_sigval.sival_int ); // TIMER_ID !!!
// from 'siginfo.h': # define si_overrun _sifields._timer.si_overrun
printf("=%08X ", s_info->si_overrun ); // Not error.
// printf(" >$%08X ", s_info->_sifields._timer.si_overrun ); // Error!
// EXPANDS TO: printf(" >$%08X ", s_info->_sifields._timer._sifields._timer.si_overrun );
当我尝试使用
s_info->_sifields._timer.si_overrun
时,我又遇到一个错误:两次扩展宏,因为定义的部分和扩展部分具有相同的符号!
filed
si_timerid
不返回计时器 ID。
标题错误还是什么?!在哪里以及如何举报?
提交的 si_timerid 不返回计时器 ID。
没错,不是这样的。
标题错误还是什么?!
什么。
该字段是 Linux 特定的。 它记录在 Linux sigaction(2) 手册页上,其中提到:
- 由 POSIX.1b 计时器(自 Linux 2.6 起)发送的信号填写
和si_overrun
。si_timerid
字段是一个 内核用来识别定时器的内部ID; 是 与si_timerid
(timer_create
) 返回的计时器 ID 不同。 [...] 这些字段是非标准 Linux 扩展。2
(强调)。
在哪里以及如何举报?
没有什么可报告的。 您正在查看的字段值与
timer_create()
提供给您的计时器ID不同是正常的。 查看该领域可能根本没有用处,如果您的代码旨在在 Linux 之外移植,当然也没有用处。
同样,读取系统标头本身也没什么用。您应该会发现几乎所有您需要依赖的内容都记录在其他地方,而且该文档通常更容易理解。