sigaction 如何既是结构又是函数?
How can sigaction be both struct and function?
我注意到 sigaction
被定义为结构和函数(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html):
int sigaction(int, const struct sigaction *restrict,
struct sigaction *restrict);
使用它的一个例子是:
struct sigaction sa;
/* Set up handler */
sa.sa_flags = SA_SIGINFO|SA_RESTART;
sa.sa_sigaction = timer_expiry;
/* Setup signal watchdog */
if (sigaction(SIG_WDOG, &sa, NULL) == -1) {
printf("ERROR: Failed to set wdog signal with %s",
strerror(errno));
}
C 有几个标识符的名称空间;函数标识符和结构标记标识符位于不同的名称空间中。
(C11, 6.2.3 Name spaces of identifiers p1) "If more than one declaration of a particular identifier is visible at any point in a
translation unit, the syntactic context disambiguates uses that refer to different entities.
Thus, there are separate name spaces for various categories of identifiers, as follows:
label names (disambiguated by the syntax of the label declaration and use);
the tags of structures, unions, and enumerations (disambiguated by following any32) of the keywords struct, union, or enum);
the members of structures or unions; each structure or union has a separate
name space for its members (disambiguated by the type of the
expression used to access the member via the . or -> operator);
all other identifiers, called ordinary identifiers (declared in ordinary declarators or as enumeration constants)
.
我注意到 sigaction
被定义为结构和函数(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html):
int sigaction(int, const struct sigaction *restrict,
struct sigaction *restrict);
使用它的一个例子是:
struct sigaction sa;
/* Set up handler */
sa.sa_flags = SA_SIGINFO|SA_RESTART;
sa.sa_sigaction = timer_expiry;
/* Setup signal watchdog */
if (sigaction(SIG_WDOG, &sa, NULL) == -1) {
printf("ERROR: Failed to set wdog signal with %s",
strerror(errno));
}
C 有几个标识符的名称空间;函数标识符和结构标记标识符位于不同的名称空间中。
(C11, 6.2.3 Name spaces of identifiers p1) "If more than one declaration of a particular identifier is visible at any point in a translation unit, the syntactic context disambiguates uses that refer to different entities. Thus, there are separate name spaces for various categories of identifiers, as follows:
label names (disambiguated by the syntax of the label declaration and use);
the tags of structures, unions, and enumerations (disambiguated by following any32) of the keywords struct, union, or enum);
the members of structures or unions; each structure or union has a separate name space for its members (disambiguated by the type of the expression used to access the member via the . or -> operator);
all other identifiers, called ordinary identifiers (declared in ordinary declarators or as enumeration constants)
.