我正在做一个简单的sigaction示例来练习C,但是当我尝试编译我的代码时,它声称不存在struct sigaction [1]。
当我签出一些旧代码时,我发现我已经在文件的最顶部添加了一些POSIX字符串[2]。但是,当我阅读Sigaction手册(man 2 sigaction)时,其中没有关于_POSIX_SOURCE的信息,最接近的是_POSIX_C_SOURCE,它不起作用。我如何以及何时知道使用哪种POSIX?当我尝试其他人建议的简单代码时,如果没有_POSIX_SOURCE,它将无法正常工作。
[1]
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void sa_handler(int signum)
{
printf("The signal has been replaced with this useless
string!\n");
exit(0);
}
int main(void)
{
struct sigaction sa = {.sa_handler = sa_handler};
int sigret = sigaction(SIGINT, &sa, NULL);
while(1);
return 0;
}
[2]
#define _POSIX_SOURCE
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void sa_handler(int signum)
{
printf("The signal has been replaced with this useless
string!\n");
exit(0);
}
int main(void)
{
struct sigaction sa = {.sa_handler = sa_handler};
int sigret = sigaction(SIGINT, &sa, NULL);
while(1);
return 0;
}
当我编译第一个示例时,结果就是这些错误消息。
sigaction.c: In function ‘main’:
sigaction.c:13:12: error: variable ‘sa’ has initializer but
incomplete type
struct sigaction sa = {.sa_handler = sa_handler};
^~~~~~~~~
sigaction.c:13:29: error: ‘struct sigaction’ has no member named
‘sa_handler’
struct sigaction sa = {.sa_handler = sa_handler};
^~~~~~~~~~
sigaction.c:13:42: warning: excess elements in struct initializer
struct sigaction sa = {.sa_handler = sa_handler};
^~~~~~~~~~
sigaction.c:13:42: note: (near initialization for ‘sa’)
sigaction.c:13:22: error: storage size of ‘sa’ isn’t known
struct sigaction sa = {.sa_handler = sa_handler};
^~
sigaction.c:14:18: warning: implicit declaration of function
‘sigaction’ [-Wimplicit-function-declaration]
int sigret = sigaction(SIGINT, &sa, NULL);
^~~~~~~~~
最佳答案
当我阅读sigaction手册(man 2 sigaction)时,其中没有关于_POSIX_SOURCE的信息。
从man sigaction:L
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
从future_test_macros(7):
_POSIX_SOURCE
用任何值定义该过时的宏等效于
用值1定义_POSIX_C_SOURCE。
由于此宏已过时,因此其用法通常不是doc-
在讨论功能测试宏要求时
手册页。
因此_POSIX_SOURCE
等效于_POSIX_C_SOURCE 1
并且已过时。
我如何以及何时知道使用哪种POSIX?
从man future_test_macros:
手册页中的功能测试宏要求规范
当功能要求定义功能测试宏时,
手册页提要通常包括注释[....]
因此,您应该在您感兴趣的功能/功能的手册页中查看“摘要”部分。例如,man sigaction:
sigaction():_POSIX_C_SOURCE
siginfo_t:_POSIX_C_SOURCE> = 199309L
因此,您需要为_POSIX_C_SOURCE
定义sigaction()
,并且将_POSIX_C_SOURCE
定义为大于或等于199309
的值。
关于c - 如何使用sigaction()?未定义struct sigaction,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54718687/