Plain C:处理程序中的计时器 ID 错误且“siginfo.h”错误?

问题描述 投票:0回答:1

所有, 我尝试将计时器 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。 标题错误还是什么?!在哪里以及如何举报?

c timer signals
1个回答
0
投票

提交的 si_timerid 不返回计时器 ID。

没错,不是这样的。

标题错误还是什么?!

什么。

该字段是 Linux 特定的。 它记录在 Linux sigaction(2) 手册页上,其中提到:

  • 由 POSIX.1b 计时器(自 Linux 2.6 起)发送的信号填写
    si_overrun
    si_timerid
    si_timerid
    字段是一个 内核用来识别定时器的内部ID; 是 与
    timer_create
    (
    2
    )
    返回的计时器 ID 不同。 [...] 这些字段是非标准 Linux 扩展。

(强调)。

在哪里以及如何举报?

没有什么可报告的。 您正在查看的字段值与

timer_create()
提供给您的计时器ID不同是正常的。 查看该领域可能根本没有用处,如果您的代码旨在在 Linux 之外移植,当然也没有用处。

同样,读取系统标头本身也没什么用。您应该会发现几乎所有您需要依赖的内容都记录在其他地方,而且该文档通常更容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.