SIG_IGN,SIG_DFL,SIG_ERR的定义

A.C*_*Cho 5 c linux signals

其中<signal.h>有以下定义:

#define SIG_ERR (void (*)())-1

#define SIG_DFL (void (*)())0

#define SIG_IGN (void (*)())1

我认为void (*)()这是一个函数指针,返回类型为void,参数为void(因为括号之间为空)。

但是在signal()函数中,第二个参数类型是void (*func)(int)

那么,为什么上面三件事的定义是void (*)()。而且,-1 0 1定义中的数字是什么意思?

我如何解释这些定义?

Ant*_*ala 4

你的定义和我的不一样。如果我预处理以下文件:

#include <signal.h>
SIG_IGN
SIG_DFL
SIG_ERR
Run Code Online (Sandbox Code Playgroud)

预处理器输出中的最后 3 行是

% gcc -E sigtest.c|tail -n3
((__sighandler_t) 1)
((__sighandler_t) 0)
((__sighandler_t) -1)
Run Code Online (Sandbox Code Playgroud)

类型定义是

typedef __signalfn_t *__sighandler_t;
Run Code Online (Sandbox Code Playgroud)

typedef void __signalfn_t(int);
Run Code Online (Sandbox Code Playgroud)

asm-generic/signal-defs.h。所以肯定是你有一些旧的标题。

然而,这不是 C++,而是 C。C 中的空括号意味着函数参数未声明/函数可以接受任意数量的参数。自 C89 标准以来,这已被认为已过时。然而,类型的值void (*)()将与 兼容void (*)(int)


值 -1、0 和 1 是不可移植的魔术常量,仅对 Linux 内核有意义。