gpt4 book ai didi

c - sigaction:不正确的成员名称

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:05 24 4
gpt4 key购买 nike

我正在将程序的信号处理从 signal() 转换为 sigaction()。

根据UNIX spec struct sigaction 应该至少有 4 个成员; sa_handlersa_masksa_flagssa_sigaction

当我定义一个结构如下时,一切看起来都很正常。

...
#include <signal.h>
...
struct sigaction sa;

但是当我尝试为 sa_handler 赋值时,该成员不存在。相反,我看到了这个: Image: shows __sigaction_handler : {sigaction.h:1092} instead of sa_handler

我查看了我的 signal.hbits/sigaction.h(如果您想知道,它们都没有 1092 行),似乎没有任何问题。

我也试过按原样使用这个成员名,但是编译器提示

incomparable types when assigning to type 'union ' from type 'void (*)(int)'

这让我觉得我的编译器/IDE 处理结构定义的方式有问题,但这超出了我如何诊断的范围。

如有任何帮助或建议,我们将不胜感激。

系统信息:

  • Debian 8
  • Linux 3.16.0-4-amd64
  • gcc 4.9.2 (Debian 4.9.2-10)
  • eclipse-cdt 3.8.1

更新 - 2016 年 8 月 3 日

找到这两个线程 herehere ,建议分别定义预处理器符号 _POSIX_C_SOURCE_XOPEN_SOURCE。我定义了每一个(一次一个)并且都“修复”了不兼容的类型问题(我成功地为 sa.__sigaction_handler 分配了一个值)。但它们也破坏了我的软件使用类型 intptr_t(用于线程函数管理)的能力,并因此被删除。

但是,这样做可以解决问题。现在,我可以将变量分配给 sa.sa_handler,而编译器不会抛出错误。 IDE 仍然将其显示为不存在的成员(与上面链接的图像相同),但恕我直言,这是一个小问题。

最佳答案

下面是 struct sigaction 在我的系统头文件中的定义方式:

/* Structure describing the action to be taken when a signal arrives.  */
struct sigaction
{
/* Signal handler. */
#ifdef __USE_POSIX199309
union
{
/* Used if SA_SIGINFO is not set. */
__sighandler_t sa_handler;
/* Used if SA_SIGINFO is set. */
void (*sa_sigaction) (int, siginfo_t *, void *);
}
__sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction __sigaction_handler.sa_sigaction
#else
__sighandler_t sa_handler;
#endif

/* Additional set of signals to be blocked. */
__sigset_t sa_mask;

/* Special flags. */
int sa_flags;

/* Restore handler. */
void (*sa_restorer) (void);
};

请注意,如果定义了 __USE_POSIX199309(它在我的系统上,也可能在您的系统上),那么就不会使用名为 sa_handler 的字段sa_sigaction,它有一个名为 __sigaction_handler 的 union 类型的字段,它又具有名为 sa_handlersa_sigaction 的字段。因此,可以通过 __sigaction_handler.sa_handler__sigaction_handler.sa_sigaction 访问字段,但为了满足规范,它还定义了宏 sa_handlersa_sigaction,分别扩展为 __sigaction_handler.sa_handler__sigaction_handler.sa_sigaction,因此您可以使用这些宏来命名字段。

现在,Eclipse 不理解这两个宏应该充当字段名称,因此当您调用 content-assist 时它不提供完成建议。

尽管如此,您应该能够在您的代码中将它们用作字段名称。也就是说,只需键入:

ascdsig.sa_handler = &sig_handle;

它会正常工作。

关于c - sigaction:不正确的成员名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com