sa_handler:无法分配“void”类型的值到“void (*)(int)”类型的实体

发布于 2025-01-14 06:19:12 字数 1469 浏览 0 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

征棹 2025-01-21 06:19:12

首先,当注册信号处理程序时,此时不应调用该函数。相反,需要一个指向函数的指针:该指针存储在 sigaction 结构中:

act_fils.sa_handler= fonction_fils; // no function call () parentheses

我们需要函数本身,而不是函数调用的返回值。

其次,该函数必须具有适合信号处理程序的类型:

void fonction_fils(int sig)
{
}

请注意,在 C 语言中,与 C++ 不同,如果将函数参数列表声明为 (),则该函数将声明为具有未知的参数类型信息。函数定义是一个不带参数的函数,与(void)兼容,但作为声明,它不会向周围的程序说明这一点。

Firstly, when a signal handler is registered, the function isn't supposed to be called at that time. Rather, a pointer to the function is required: the pointer is stored into the sigaction structure:

act_fils.sa_handler= fonction_fils; // no function call () parentheses

We want the funtion itself, not the return value from a call to the function.

Secondly, the function has to have the right type for a signal handler:

void fonction_fils(int sig)
{
}

Note that in the C language, unlike C++, if you declare a function paramter list as (), it declares the function as having an unknown parameter type information. The function definition is one that takes no arguments, compatible with (void), but as a declaration it doesn't say that to the surrounding program.

萌梦深 2025-01-21 06:19:12

而不是像这样的语句

act_fils.sa_handler= fonction_fils();

以及

act_pere.sa_handler=fonction_pere();

使用具有返回类型 void 的函数调用

act_fils.sa_handler= fonction_fils;

您需要编写并

act_pere.sa_handler=fonction_pere;

分配函数指针,

。注意,例如数据成员sa_handler具有类型,

void     (*sa_handler)(int);

因此相应的函数应具有相同的类型。

从文档中

  sa_handler specifies the action to be associated with signum and
   is be one of the following:

   * SIG_DFL for the default action.

   * SIG_IGN to ignore this signal.

   * A pointer to a signal handling function.  This function
     receives the signal number as its only argument.

Instead of statements like these

act_fils.sa_handler= fonction_fils();

and

act_pere.sa_handler=fonction_pere();

where there are used function calls that have the return type void you need to write

act_fils.sa_handler= fonction_fils;

and

act_pere.sa_handler=fonction_pere;

to assign function pointers.

Pay attention to that for example the data member sa_handler has the type

void     (*sa_handler)(int);

So the corresponding function shall have the same type.

From the documentation

  sa_handler specifies the action to be associated with signum and
   is be one of the following:

   * SIG_DFL for the default action.

   * SIG_IGN to ignore this signal.

   * A pointer to a signal handling function.  This function
     receives the signal number as its only argument.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文